4

で思った

cout << "Hello world" 

coutオブジェクトには演算子のオーバーロードがあるため、オブジェクトのメンバー関数stringsに渡すことができます。cout

しかし、いくつかのコード例では、演算子のオーバーロードが定義されているクラスを見ました。

class GenericPlayer : public Hand
{
    ..
    friend ostream& operator <<(ostream& os, const GenericPlayer& aGenericPlayer);
    ..
};

...
cout << aGenericPlayer << endl;
...

coutそうでない場合でも、との両方がaGenericPlayerオーバーロードされている場合はどうなりoperator<<ますか?


画像の写真を iPhone にピン留めするための Pinterest API コード サンプル

こんにちは ピンタレスト API にアクセスして、iPhone または iPad で写真や画像を投稿できた人はいますか? できればサンプルを投稿してください

4

4 に答える 4

8

そうでない場合でも、 cout と aGenericPlayer の両方が operator<< をオーバーロードするとどうなりますか?

std::coutstd::ostreamオブジェクトなので、すべてstd::ostream& operator<<(std::ostream, SomeType)が で動作しstd::coutます。ただし、要点は、演算子の 2 番目のパラメーターが異なるため、オーバーロードが異なるということです。最初の「文字列」は次のようなものです

std::ostream& operator<<(std::ostream&, const char*);

そして2番目

std::ostream& operator <<(std::ostream& os, const GenericPlayer& aGenericPlayer); 

したがって、それらは異なる演算子のオーバーロードであり、あいまいさはありません。

于 2012-12-10T21:44:54.000 に答える
2

まず、何coutaGenericPlayerオーバーロードできません。それらはオブジェクトであり、オーバーロードは型に基づいています (通常は型 X のオーバーロードとは言わず、型 X を 2 番目の引数として取ることができる<<オーバーロードがあるとします)。<<

次に、オーバーロードの解決は、1 つだけでなく、すべての引数に基づいています。<<for std::istream(の型の基本クラス) には約 20 の異なるオーバーロードがありますがstd::cout、(少なくとも標準ライブラリでは) GenericPlayer2 番目のパラメーターとして a を受け取るものはありません。そのため、2 番目のオペランドが . でない場合は使用できませんGenericPlayer。同様に、あなたが持っているoperator<<( int, GenericPlayer const& )ものに加えて , を持つことができます; 左側に typeintがあり、右側にtype がある場合に呼び出されGenericPlayerます。(これが演算子のオーバーロードの悪用にならないケースは考えられませんが、言語は確かにそれを許可しています。)

于 2012-12-10T21:57:49.837 に答える
1

cout と aGenericPlayer の両方が operator<< のオーバーロードの場合

どちらもオーバーロードせず、(メンバーではなく) 通常の関数としてオーバーロードされます。friendあなたの例での使用に注意してください。これにより、関数はメンバーにならずにクラスの内部にアクセスできます。したがって、この状況は回避されます。

于 2012-12-10T21:51:35.727 に答える
1

がオブジェクトcoutを受け入れるには、をオーバーロードする必要があります。挿入演算子とも呼ばれます。したがって、それをコンテキストで使用すると、カスタム関数の出力を に挿入することになります。オーバーロードされた演算子は、元の ostream オブジェクトへの参照を返します。これは、挿入を組み合わせることができることも意味します。左側のオブジェクトと右側のオブジェクトを認識するには、挿入演算子をオーバーロードする必要があります。独自のクラスの << 演算子のオーバーロード も参照してください。は、標準出力ストリームを表す のオブジェクトです。ストリームに対応しています。なぜならGenericPlayeroperator<<operator<<coutostreamGenericPlayercoutcoutclass ostreamcstdiostdoutcoutはクラス ostream のオブジェクトです。たとえば、挿入演算子 (ostream::operator<<) を使用して書式設定されたデータとして、または write メンバー関数を使用して書式設定されていないデータとして文字を書き込むことができます。

于 2012-12-10T21:45:00.827 に答える