5

クラスのストリーム演算子はクラスではなくストリームクラスの関数であるように見えるため、C++でクラスのストリーム演算子をオーバーロードする方法について少し混乱しています。これを行う通常の方法は何ですか?現時点では、「getfrom」演算子の定義があります

istream& operator>>(istream& is, Thing& thing) { // etc...

動作します。Thingクラスの定義には記載されていません。実装時にThingクラスのメンバーにアクセスできるようにしたいのですが、これを行うにはどうすればよいですか?

4

4 に答える 4

9

実装は問題ありません。実行する必要がある唯一の追加手順は、演算子を次のように宣言することfriendですThing

class Thing {
public:
  friend istream& operator>>(istream&, Thing&);
  ...
}
于 2010-02-28T18:02:42.407 に答える
8

他の答えは正しいです。それがあなたを助ける場合のために、ここにコード例(ソース)があります:

class MyClass {
  int x, y;
public:
  MyClass(int i, int j) { 
     x = i; 
     y = j; 
  }
  friend ostream &operator<<(ostream &stream, MyClass ob);
  friend istream &operator>>(istream &stream, MyClass &ob);
};

ostream &operator<<(ostream &stream, MyClass ob)
{
  stream << ob.x << ' ' << ob.y << '\n';

  return stream;
}

istream &operator>>(istream &stream, MyClass &ob)
{
  stream >> ob.x >> ob.y;

  return stream;
}
于 2010-02-28T18:05:32.633 に答える
6

あなたoperator>>はThingクラスの友達になります。

于 2010-02-28T18:02:30.290 に答える
2

いくつかのアプローチがあり、正しいものはクラスが何をするかに本当に依存します。

多くの場合、情報の読み取りを可能にするパブリックAPIを使用することは理にかなっています。その場合、ストリーミングオペレーターはプライベートにアクセスする必要はありません。

おそらく最も人気のあるアプローチは、クラスの友達のストリーミング機能を宣言することです。

私のお気に入りは、どちらの方法でもストリーミングに使用できるパブリックBoost.Serializationスタイルのテンプレート関数を提供することです。

于 2010-02-28T18:06:30.827 に答える