問題タブ [friend-function]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
671 参照

c++ - クラスの友達としてではなく、クラス内で抽出演算子をオーバーロードする方法はありますか?

<<演算子をオーバーロードしようとしているので、std :: coutでクラスオブジェクトを使用すると、出力されるはずのデータメンバーが出力されます。クラス内でフレンド関数シグネチャを定義する必要があることを知っています。次に、クラス外で、ジョブを実行する2つのフレンド関数を定義しますが、クラスを引き渡したいので、ユーザーに文字通り何もさせたくありません。クラスにすべての面倒を見てもらいたい。どうすればC++でそのようなことを達成できますか?

前もって感謝します

0 投票する
5 に答える
906 参照

c++ - C++ のフレンド関数

C++ のフレンド関数に関連する疑問があります。フレンド関数はクラスのメンバー関数ではなく、メインから直接呼び出すことができます。friendでは、関数を 内またはprivatepublic一部に保持すると、どのような違いが生じますかclassfriend私は一般的に、関数が常に公開部分にあることに気付きました。どのシナリオで、friend関数を 内に保持する必要がありますかprivate

0 投票する
2 に答える
147 参照

c++ - オーバーロードされた演算子の引数に対して暗黙的な変換を行う際のコンパイラ エラー

私は疑問に出くわした本からいくつかの演習を行っています。クラス ( Stonewt )のフレンド関数として、いくつかの演算子のオーバーロードを定義しました。問題は、次のようなプロトタイプで発生します。

次のように、コンストラクターに依存して暗黙的な変換を行い、コンパイラーに作業を任せるとします (test1 と test2 はクラス オブジェクトです)。

次のようなエラー メッセージが表示されます。

'std::basic_ostream' 左辺値を 'std::basic_ostream&&' にバインドできません

'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) の引数 1 を初期化します [with _CharT = char; _Traits = std::char_traits; _Tp = Stonewt]'

OTOH、次のようにすると、エラーは発生しません。

コンパイラが Stonewt オブジェクトを取得した場合、Stonewt& への変換を行うことができます (これが関数の期待です)。しかし、それ以外のものを取得すると、Stonewt& に到達するまでの手順を実行できません。(これと同じことが、operator* のような他の演算子のオーバーロードを使用する他のインスタンスでも発生します。double を配置し、コンパイラーがコンストラクターを介してそれを Stonewt に変換し、次に Stonewt& に変換することを期待すると、機能しません。Stonewt を配置する必要があります。物体)。

これは正しい動作ですか?何か助けはありますか?

必要な場合に備えて、プログラム全体を配置します。

クラス定義:

メソッド + フレンド関数 + 変換関数の実装:

クライアント (未完成):

0 投票する
3 に答える
4577 参照

c++ - pthread_create関数で'*void(MyClass :: *)(void *)をvoid *(*)(void *)に変換できません

クラス「CameraManager」で新しいスレッドを作成しようとしていますが、次のエラーが発生します。

pthread_create関数で'*void(CameraManager :: *)(void *)をvoid *(*)(void *)に変換できません

私はcameramanager.hファイルで定義しました:

とcameramanager.cppで

dequeueLoopを静的関数として宣言したくない私も次の方法でdequeueLoopをクラスフレンド関数として宣言しようとしましたが、クラス変数「highSpeedCamera」と「dequeuing」のスコープがなく、コンパイラも通知します'dequeueLoop'がこのスコープで宣言されていないことを私に

dequeueLoopをフレンド関数にするために:

cameramanager.h

cameramanager.cpp

私はどこで間違っているのですか?

0 投票する
4 に答える
44625 参照

c++ - c++エラーC2662は、「this」ポインタを「const Type」から「Type &」に変換できません

C++ operator== をオーバーロードしようとしていますが、いくつかのエラーが発生しています...

エラー C2662: 'CombatEvent::getType': 'this' ポインターを 'const CombatEvent' から 'CombatEvent &' に変換できません

このエラーはこの行にあります

以下のコードを参照してください。

誰でも助けることができますか?

0 投票する
1 に答える
158 参照

c++ - 完全に特殊化されたテンプレート関数でクラスのオブジェクトをインスタンス化する

クラスBの友達として関数を宣言しているのに、完全に特殊化された関数でクラスBのオブジェクトをインスタンス化できない理由がわかりません。助けてください。それがばかげているかどうかはわかりません。しかし、私は初めてC++テンプレートを学習しています。次のエラーが発生します。

0 投票する
3 に答える
6887 参照

c++ - 関数がオブジェクトの状態を変更することになっている場合、メンバー関数とフレンド関数のどちらを使用しますか?

Bjarne Stroustrup 著 The C++ Programming Language という本の中で、著者は関数 inv() を実装しなければならないクラス Matrix を紹介しています。セクション 11.5.1 で、彼はそれを行う 2 つの可能性について語っています。1 つはメンバー関数を作成する方法で、もう 1 つはフレンド関数 inv() を作成する方法です。それから、セクション 11.5.2 の終わりに向かって、彼はフレンド関数を使用するかメンバー関数を使用するかの選択を行うことについて話します。

inv() が m の逆数である新しい Matrix を返すのではなく、実際に Matrix m 自体を逆にする場合、それはメンバーである必要があります。

なぜそうなのですか?フレンド関数でマトリックスの状態を変更して、そのマトリックスへの参照を返すことはできませんか? 関数を呼び出すときに一時行列を渡す可能性があるためですか?..

0 投票する
4 に答える
217 参照

c++ - フレンド関数でアクセサを使用する必要がありますか?

ここにクラスがあります

ここにostream関数があります

}

ここに getname メソッドと getID メソッドがあります

私の質問は、なぜ getID 関数と getname 関数を使用する必要があるのか​​ということです。"this->name" と書いて name にアクセスすることはできませんか? 回答ありがとうございます。

0 投票する
3 に答える
563 参照

c++ - テンプレート クラスの operator<< をオーバーロードする

テンプレート クラスの operator<< のオーバーロードに問題があります。私は Visual Studio 2010 を使用しています。これが私のコードです。

主に私はちょうど持っています

whereは、必要な特別な機能を備えIntegerた単なるラッパーです。int

ただし、上記のコードをコンパイルすると、エラー C2679 が表示されます。binary '<<' : no operator found which takes a right-hand operand of type 'Polyff::FiniteField<T,n>' (or there is no acceptable conversion)

コードが次のようになるように、フレンド宣言のパラメーターも削除しようとしました。

しかし、これは別のエラーを生成します: C2785:'std::ostream &Polyff::operator <<(std::ostream &,const Polyff::FiniteField<T,n> &)' and '<Unknown>' have different return types

だから、コンパイルできるようにコードをどのように変更すればよいのでしょうか?なぜですか? ありがとう!

------------------------- 2012.12.31 編集 -------------------- -------

コードは g++ でコンパイルされるようになりました。ここに github リポジトリがあります。

0 投票する
1 に答える
150 参照

c++ - 通常クラスのフレンドテンプレート関数

普通のクラスにテンプレートフレンド機能が必要だと思います。この関数は、共有メモリで複雑な割り当てを行ったり、ハードウェアや OS を調べたりします。しかし、問題が -template- および/または -friend- の側面に関連しており、より邪悪なものではないことを示すために、私はそのすべてを除外しました. 主な部分は、クラスのインスタンスとそのメンバー データをすべて、ジェネリック パラメーターとして渡すことができるアロケーターで割り当てる必要があるということです。

これが正しい解決策であるべきだと思います。alloc_Foo のみがコンストラクターを呼び出す必要があり、ファクトリ メソッドのみが alloc_Foo を呼び出す必要があります。Foo のインスタンスとその個別に割り当てられた内部パーツは、本来あるべき共有メモリに作成され、すべての複雑な割り当ては alloc_Foo フレンド テンプレートに隠されます。この部分は問題なく動作します。alloc_Foo の実装は短くて単純なので、同じファイルに実装してもかまいません。しかし、alloc_Foo を呼び出すファクトリは大規模で複雑であり、クリーンで単純なクラスが数十のインクルードと数百行のコードで乱雑になります。

各ファクトリを個別のファイルに入れることができるように、最後に実装を含めようとしました。

次に、.tpp ファイルに実際のコードを入れましたが、bar.h など、何も含めることができないようです。#include ルールは崩壊しているようです。テンプレート アロケータの友人と何か関係があるのではないかと心配しています。他の多くの問題を解決してくれるので、それを失うのは絶対に嫌です。

通常、私はスコープ取引にそれほどこだわることはありませんが、これは私にとって珍しい組み合わせです. 多分私は取引全体を考えすぎています。alloc_Foo は、私が隠しているコンストラクターを見ることができるように、友人でなければならないと考えています。私は、これも非公開にする必要があり、工場だけが使用できるようにする必要があると考えています。アロケーターとファクトリーの両方が実際には関数の一部ではないと私は考えています。彼らは「これ」を持っていないか、必要としません。多分それらは静的であるべきです。多くの内部パーツと各インスタンスの実際のオブジェクト自体で特別なアロケーターを使用する必要があるため、テンプレートである必要があると考えています。静的である必要があります。

誰でも助けることができますか?

ありがとう。