<<演算子をオーバーロードしようとしているので、std :: coutでクラスオブジェクトを使用すると、出力されるはずのデータメンバーが出力されます。クラス内でフレンド関数シグネチャを定義する必要があることを知っています。次に、クラス外で、ジョブを実行する2つのフレンド関数を定義しますが、クラスを引き渡したいので、ユーザーに文字通り何もさせたくありません。クラスにすべての面倒を見てもらいたい。どうすればC++でそのようなことを達成できますか?
前もって感謝します
<<演算子をオーバーロードしようとしているので、std :: coutでクラスオブジェクトを使用すると、出力されるはずのデータメンバーが出力されます。クラス内でフレンド関数シグネチャを定義する必要があることを知っています。次に、クラス外で、ジョブを実行する2つのフレンド関数を定義しますが、クラスを引き渡したいので、ユーザーに文字通り何もさせたくありません。クラスにすべての面倒を見てもらいたい。どうすればC++でそのようなことを達成できますか?
前もって感謝します
C ++は、非メンバー関数が他の言語のメンバー関数を必要とすることを実行できるように設計されています。friend
関数は、クラススコープ内で定義できるという点で、メンバー関数と非常によく似ています。また(これは混乱を招く可能性があります)、クラススコープ内でのみfriend
関数を宣言する場合、そのクラスのオブジェクトを渡すことによってのみアクセスできます。
struct printme {
friend std::ostream &operator<< ( std::ostream &os, printme const & )
{ return os << "hello"; }
friend void named_friend( printme const & ) {}
};
std::cout << printme(); // OK
named_friend( printme() ); // OK
void (*fn_ptr) = named_friend; /* function not found
it can only be found by association with printme */
この微妙なルールは最初は奇妙ですが、非メンバー関数もクラスによってカプセル化できるという考えを反映しています。
詳細については、引数依存のルックアップ(ADL)を参照してください。
通常、<<は次のように使用します。
cout<<myobject;
operator <<()をクラスのメンバー関数にする場合は、次の構文を使用してoperator <<()を呼び出す必要があります。
myobject<<cout;
あなたはそれをそのようにしたいですか?よろしければ、メンバー関数にすることができます。
あなたがそれを好きなら
cout<<myobject
-operator <<()をクラスのフレンド関数にする必要があります
次に例を示します。
#include <iostream>
#include <string>
using namespace std;
class A {
public:
string pr() { return "Hi, I'm class A"; }
};
ostream &operator << (ostream &o, const A &a) {
o << a.pr();
return o;
}
int main() {
A a;
cout << a << endl;
return 0;
}
しかし、私の経験から、そうしないでください。Oveloadingは学術的には優れていますが、アプリケーションでその実装を検索するのが難しくなり、<<がオーバーロードされていることさえ理解できます。私はいつも何かの形を使いますcout << myobject.tostring()