コンストラクター内に他の子オブジェクトを作成するオブジェクトがあり、「this」を渡して、子がポインターを親に戻すことができるようにします。std :: auto_ptrまたはrawポインターのより安全な代替手段として、プログラミングでboost::shared_ptrを広範囲に使用しています。したがって、子には、などのコードがshared_ptr<Parent>
あり、boostは親が子shared_from_this()
に与えることができるメソッドを提供します。
私の問題はshared_from_this()
、コンストラクターで使用できないことです。これは、実際には犯罪ではありません。何をしているのかを理解し、制限を気にしない限り、「this」をコンストラクターで使用するべきではないからです。
GoogleのC++スタイルガイドでは、コンストラクターはメンバー変数を初期値に設定するだけでよいと述べています。複雑な初期化は、明示的なInit()メソッドで行う必要があります。これにより、「コンストラクター内のこの」問題だけでなく、他のいくつかの問題も解決されます。
私を悩ませているのは、あなたのコードを使用している人々は、あなたのオブジェクトの1つを構築するたびにInit()を呼び出すことを忘れないでください。これを強制するために私が考えることができる唯一の方法は、Init()がすでにすべてのメンバー関数の先頭で呼び出されているというアサーションを持つことですが、これは書くのが面倒で実行が面倒です。
途中でこの問題を解決するイディオムはありますか?