3
4

4 に答える 4

2

ostream 演算子をクラス自体に配置すると、期待どおりに動作しません。それを呼び出すには、これを行う必要があることを意味するメンバー関数になります。c.operator<<("output")これは、明らかにあなたが意図していることではありません。ostream 演算子が期待どおりに機能するには、クラスの外にある必要があります。これを行うには、それをフレンドにするか、単にクラスの外に置き、ゲッター (アクセサー) を使用してデータを出力します。

于 2012-05-31T21:52:25.917 に答える
2

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;
}
于 2012-05-31T21:52:26.360 に答える
2

友達である必要はありませんが、メンバーになることはできません。メンバー演算子は、左側のオペランドに対応するクラス内にある場合にのみ機能します。

于 2012-05-31T21:57:19.953 に答える
1

残念ながら、ストリーミング出力演算子 ( << ) の便利なオーバーロードは、クラス メンバーにすることはできません。これは、ostream& を使用および宣言の左側に配置する必要があるためです。保護されたメンバーまたはプライベート メンバーへのアクセスが必要でない限り、ストリーミングしたいクラスのフレンドである必要はありません。これは、フレンドとして宣言せずに、オブザーバー/アクセサーなどのパブリック関数のみを使用してストリーミング オペレーターを実装できる場合を意味します。

最初の Counter クラスで、有効と思われないクラスのメンバー関数を宣言しています。Counter クラスの 2 番目の例では、有効と思われる << の演算子のオーバーロードがプライベート メンバーにアクセスできることを示しています。2 番目の例では、関数をクラスの外で宣言する必要があります。

Wikipedia Operators in C and C++には、あまり有用ではありませんが、クラス内の << オーバーロードを含む、考えられる演算子のオーバーロードの優れたリストがあります。クラス内のオーバーロードは逆方向に呼び出す必要がありますが、CounterInstance << cout;これは直感に反します。

于 2012-05-31T21:58:57.067 に答える