C++ は、ストリーム パラダイムを使用して標準入出力を実装します。
ストリーム パラダイムとは、アプリケーションがリソース (ファイル、コンソールなど) にアクセス/使用したい場合、ストリームがアプリケーションとリソースの間のメディエーターとして機能することを意味します。
ofstream +----+
+-------------------->|File|
| +----+
|
+------+------+
| Application |
+------+------+
|
| +-------+
+-------------------->|Console|
cout +-------+
これは、実行するすべての書き込み/読み取り操作が実際にはストリーム操作であることを意味します。これのポイントは、使用しているリソースのタイプ (およびストリームのタイプ) に関係なく、ストリーム操作は基本的に同じであるということです。
これにより、「ジェネリック」を実装できます (ジェネリックとは、あらゆるタイプのストリーム/リソースに有効な意味です)。どのように?C++ 演算子 >> および << のオーバーロード。
入力操作 (入力とは、ストリームからデータを受け取り、それを変数/オブジェクトに入れることを意味します) の場合、次のように >> 演算子をオーバーロードする必要があります。
istream& operator>>(istream& is , MyClass& object)
{
is >> object.myClassAtributte; (1)
... //Same for every attribute of your class.
return is;
}
まず、入力ストリームが参照によって渡されることに注意してください。ストリームはコピー不可であるため (ストリームをコピーするとは正確にはどういう意味ですか? アプリとリソースの間のリンクをコピーしますか? それはばかげているように聞こえます)、ストリームを変更しようとしているため、const ではありません (次のように記述します)。それを通して)。
最後に、関数は void を返さず、関数に渡されたのと同じストリームへの参照を返すことに注意してください。これにより、次のような連結された書き込み/読み取り文を書くことができますcout << "Hello. " << "Im" << " Manu343726" << endl;
出力操作 (出力はデータをストリームに送信することを意味します) の場合、 << 演算子をオーバーロードする必要がありますが、その実装はまったく同じです。
ostream& operator<<(ostream& os , const MyClass& object)
{
os << object.myClassAtributte; (1)
... //Same for every attribute of your class.
return os;
}
この場合、オブジェクトは const に渡されることに注意してください。これは、オブジェクトを変更しないためです (属性のみを読み取ります)。
(1)この関数を実装して、クラスの友達にして、プライベート/保護されたメンバーにアクセスできるようにすることをお勧めします。