4 に答える
ostream 演算子をクラス自体に配置すると、期待どおりに動作しません。それを呼び出すには、これを行う必要があることを意味するメンバー関数になります。c.operator<<("output")
これは、明らかにあなたが意図していることではありません。ostream 演算子が期待どおりに機能するには、クラスの外にある必要があります。これを行うには、それをフレンドにするか、単にクラスの外に置き、ゲッター (アクセサー) を使用してデータを出力します。
public
の値を返すクエリ メソッドを追加しcount_
ますfriend
。
Counter{
public:
int count() const { return count_; }
private:
int count_;
};
std::ostream& operator<<(std::ostream& outStream, const Counter& c){
outStream << c.count();
return outStream;
}
友達である必要はありませんが、メンバーになることはできません。メンバー演算子は、左側のオペランドに対応するクラス内にある場合にのみ機能します。
残念ながら、ストリーミング出力演算子 ( << ) の便利なオーバーロードは、クラス メンバーにすることはできません。これは、ostream& を使用および宣言の左側に配置する必要があるためです。保護されたメンバーまたはプライベート メンバーへのアクセスが必要でない限り、ストリーミングしたいクラスのフレンドである必要はありません。これは、フレンドとして宣言せずに、オブザーバー/アクセサーなどのパブリック関数のみを使用してストリーミング オペレーターを実装できる場合を意味します。
最初の Counter クラスで、有効と思われないクラスのメンバー関数を宣言しています。Counter クラスの 2 番目の例では、有効と思われる << の演算子のオーバーロードがプライベート メンバーにアクセスできることを示しています。2 番目の例では、関数をクラスの外で宣言する必要があります。
Wikipedia Operators in C and C++には、あまり有用ではありませんが、クラス内の << オーバーロードを含む、考えられる演算子のオーバーロードの優れたリストがあります。クラス内のオーバーロードは逆方向に呼び出す必要がありますが、CounterInstance << cout;
これは直感に反します。