2017-07-11 4 views
-1
#include <iostream> 

using namespace std; 

struct X{ 
    int _x; 
    X(int x=0):_x(x){} 
}; 

int main() { 
    X arr[5]; 
    for (int i = 0;i < 5;i++) { 
     arr[i] = i; 
    } 
    for (int i = 0;i < 5;i++) { 
     cout << arr[i] <<","; 
    } 
    return 0; 
} 

いつ私はoperator <<をオーバーロードする必要がありますか?いつオペレータ<<をオーバーロードする必要がありますか?

arrにはintがあるので、オーバーロードしないでください。<<

+3

'arr'はないint''の 'X'の配列です。そのため、ストリームの 'operator <<'をオーバーロードする必要があります。なぜなら、 'X'をとる演算子のオーバーロードがないからです。 – Rakete1111

+3

*オペレータに何かをオーバーロードさせる必要があるのはいつですか?*コンパイラが適切なオーバーロードを見つけることができないと言ったとき(あなたはそれを使ってコンパイラエラーを取得しようとします)。 – NathanOliver

+0

'std :: cout << arr [i] ._ x;'を試してください。あなたはそれを動作させるために何かをオーバーロードする必要はありませんが、 '_x'はそれがプライベートであるように見えるので、適切なオーバーロードをするとより良いものになります – user463035818

答えて

2

Xは単なるintプロパティの単なるラッパーですが、intとは異なるタイプです。良いニュースは、あなただけのこの機能を追加することによって、int方法に委任することができますされています

std::ostream& operator<<(std::ostream& o, const X& x) { 
    o << x._x; 
    return o; 
} 
+1

'ostream'に書き込む' operator << 'は、構造体のメンバーではなく、スタンドアロンの関数として実装する必要があります。そして、 '_x'は公にアクセス可能であるので' friend'は必要ありません。 –

+0

@RemyLebeauちょうど一緒にこれを一緒に投げた、それは正常にコンパイルし、期待どおりに実行しました。私はあなたのアドバイスを編集に考慮に入れました。 – tadman

+0

ありがとうal lot <3 @tadman –

関連する問題