2

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()

4

1 に答える 1

1

一般的な場合、正解は1つではありません。コンストラクター、create()、create_child()、すべてパブリックのこれらすべてのメソッドを作成することから始めることができます。次に、インターフェイスを使用している間、できればテスト中に(可能であれば、「実際の」コードで使用する前に実行できるように)、さまざまな構築オプションの考えられる副作用、結果、および利便性を調べて、何を決定します。特定のユースケースに最適で、何が安全か。

当然のことながら、すべてが安全であれば、3つすべてを公開したままにしておくことができます。それ以外の場合は、安全でないものをプライベートにし(派生するクラスのコンストラクターの場合は保護し)、安全なものをユーザーが使用できるように公開したままにして、安全でないものを非表示にします。

于 2013-02-12T22:56:57.200 に答える