私はJavaのバックグラウンドを持っていますが、その後C ++を学び、数年前からプログラミングを行っています(プログラムを最初から設計するのではなく、ほとんどの場合、デバッグと修正の作成を行っています)。しかし、今日私は問題に遭遇しました、そして率直に言って、私はそれに遭遇するのにこれほど長い時間がかかったことに少し驚いています。
Class1という名前のクラスがあり、そのヘッダーファイルに(他のコードの中でも)次のものが含まれているとします。
class Class1 {
private:
Class2 object;
}
Class2クラスには、デフォルトのコンストラクターが指定されていません。ここで、Class1コンストラクターで、ファイルのバイナリヘッダーを読み取り、そこから解析した情報を使用して、以下の擬似コードに示すように、Class2を初期化します。
Class1::Class1(std::string) {
// Read some binary info from a file here
// Parse that binary info
object2 = Class2(info);
Javaでは、RAIIパラダイムを使用していないため、これは完全に合法です。ただし、C ++はRAIIを使用するため、オブジェクト2は、私が行うまでにデフォルトのコンストラクターで既に初期化されていますobject2 = Class2(info);
。作成する必要のある情報がobject
まだなかったため、元々(Class1ヘッダーファイルで)そのコンストラクターを呼び出すことはできませんでした。object2
ただし、コンストラクターを表示/使用するには他の関数が必要なため、コンストラクターに対してローカルにすることはできません。
明らかにこれは機能しません。このようなものの標準的なアプローチは何ですか?私は実際に、Class1を次のようなClass2ポインタを持つように変更することを考えました。
class Class1 {
private:
Class2* objectPointer;
}
その後、を呼び出し*objectPointer = Class2(info)
ます。ただし、私の場合の「Class2」はifstreamであり、operator=
関数が削除されているようで、どちらのアプローチでも機能しません。
だから...どうすればこれを行うことができますか?