enable_shared_from_thisから継承するクラスがあります。子オブジェクトがshared_ptr
あり、「ルート」オブジェクトが1つあるため、階層全体がshared_ptrによって管理されます。このようにして、オブジェクトは複数の親を持つことができ、安全に破棄できます。
コンストラクターを書き始めたところ、ユーザーはstd::shared_ptr
私が内部で行っているように、そしていくつかの既存のライブラリー、たとえばgtkmmで見たように、オブジェクトを管理する必要があることに気付きました。shared_ptr
だから私は他の人がしているのを見ることができます:コンストラクターを隠し、新しいオブジェクトにを返す静的メンバー関数create()を書きます。明らかにcreate()は非常に便利です。それがないと、std::make_shared()
または後で呼び出す必要があるからstd::shared_from_this()
です。
しかし、コンストラクターを非表示にする必要があります。その理由は何ですか。いくつかの正当な理由を推測できます。たとえば、ユーザーにshared_ptrの使用を強制します。そうしないと、オブジェクトが削除されるため、ユーザーがshared_ptrによって管理されていない「孤立した」オブジェクトを使用しないことが保証されます。また、ユーザーが手動でshared_ptrを作成することを忘れないようにします。これは、オブジェクトがコピーされた場合でも(ポインターのコピーではなく、ディープコピー)、オブジェクトが削除されることを意味するためです。その後、ユーザーはそのことにすぐに気付きます。
もう1つの興味深いオプションは、create()静的メソッドを使用せず、代わりにadd_child()メソッドを使用して新しいオブジェクトを作成する唯一の方法です。これにより、階層にリンクされていることが保証されます。問題:柔軟性。誰かがオブジェクトを個別に使用したい場合、クラスを派生させない限り、それは不可能です。
あなたは何をしますか/私は何をすべきですか?ctorを非表示/非表示にしませんか?add_child()
?create()
?