cout << myclassを使用するにはどうすればよいですか


82

myclass 私が書いたC ++クラスであり、私が書いたとき:

myclass x;
cout << x;

どうすれば出力を行う1020.2のように、integerまたはfloat値はありますか?

回答:


100

通常operator<<、クラスのオーバーロードによって:

struct myclass { 
    int i;
};

std::ostream &operator<<(std::ostream &os, myclass const &m) { 
    return os << m.i;
}

int main() { 
    myclass x(10);

    std::cout << x;
    return 0;
}

9
フィールドがあり、それらを出力したい場合myclassは、フレンドとして宣言する必要があることに注意してください。privateoperator<<()myclassstd::ostream& operator<<(std::ostream&, myclass const&)
ジャスティンタイム-モニカを復活させる2017年

3
これはconst myclass &m代わりにすべきではありませんmyclass const &mか?
nubcake 2017

3
@Nubcake:いいえ。コンパイラーが気にする限り、この2つは同じ意味ですが、それでもプレフィックス形式が間違っていると思います。C ++宣言を読むには、宣言されているものから始めてconst、型の後に次のように記述して、外側に向かって進みますm is a reference to a const myclass。タイプ前にそれで、それはmは無意味と真に非文法的とのぎざぎざのエッジ上の権利であるのMyClassのconst`への参照である」と言う。
ジェリーの棺

1
私のように混乱している人のために、演算子のオーバーロードをクラス定義のに置いてください(例のように)。
umnikos

1
@Lorenzo:いいえ、メンバー関数にすることはできません。詳細については、stackoverflow.com / a / 9814453/179910を参照してください。
ジェリーコフィン

22

<<演算子をオーバーロードする必要があります、

std::ostream& operator<<(std::ostream& os, const myclass& obj)
{
      os << obj.somevalue;
      return os;
}

次に、実行するとcout << x(この場合x、タイプmyclassはどこにありますか)、メソッドで指示した内容がすべて出力されます。上記の例の場合、それはx.somevalueメンバーになります。

メンバーの型をに直接追加できないostream場合は<<、上記と同じ方法を使用して、その型の演算子もオーバーロードする必要があります。


4
これは左シフト演算子であり、「ストリーム演算子」ではありません。Iostreamのコンテキストでは、これは挿入演算子または抽出演算子のいずれかですが、ストリーム演算子ではありません。
Billy ONeal 2010年

1
申し訳ありませんが、はい、その通りです。私はストリームを扱うときにのみ使用する傾向があるので、それは私が頭の中でそれを呼んでいるものです。この場合、ストリーム演算子ではなく、あなたが言うように挿入演算子になります。そのビットを削除するために私の答えを更新しました。
リッチアダムス

14

非常に簡単です。実装するだけです。

std::ostream & operator<<(std::ostream & os, const myclass & foo)
{
   os << foo.var;
   return os;
}

outpoutをチェーンするには、osへの参照を返す必要があります(cout << foo << 42 << endl)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.