private friend
コンストラクターのアプリケーション ロジックを実装し、さまざまなコンストラクターによって呼び出されるメソッドの使用を提案します。次に例を示します。
StreamArrayReader
いくつかのプライベート フィールドで呼び出されるクラスがあるとします。
private:
istream * in;
// More private fields
そして、2 つのコンストラクターを定義します。
public:
StreamArrayReader(istream * in_stream);
StreamArrayReader(char * filepath);
// More constructors...
2 番目のものは最初のものを単純に利用します (もちろん、前者の実装を複製したくはありません)。理想的には、次のようなことをしたいでしょう:
StreamArrayReader::StreamArrayReader(istream * in_stream){
// Implementation
}
StreamArrayReader::StreamArrayReader(char * filepath) {
ifstream instream;
instream.open(filepath);
StreamArrayReader(&instream);
instream.close();
}
ただし、これは C++ では許可されていません。そのため、最初のコンストラクターが行うべきことを実装するプライベート フレンド メソッドを次のように定義できます。
private:
friend void init_stream_array_reader(StreamArrayReader *o, istream * is);
これで、このメソッドは (フレンドであるため) のプライベート フィールドにアクセスできるようになりましたo
。次に、最初のコンストラクターは次のようになります。
StreamArrayReader::StreamArrayReader(istream * is) {
init_stream_array_reader(this, is);
}
これにより、新しく作成されたコピーに対して複数のコピーが作成されるわけではないことに注意してください。2 つ目は次のようになります。
StreamArrayReader::StreamArrayReader(char * filepath) {
ifstream instream;
instream.open(filepath);
init_stream_array_reader(this, &instream);
instream.close();
}
つまり、1 つのコンストラクターが別のコンストラクターを呼び出す代わりに、両方ともプライベート フレンドを呼び出します。