3

これはおそらく「ベストプラクティス」の質問ですが、これが正しい方法で行われていることを確認したかったのです。

私は次のクラスを持っています:

typedef boost::shared_ptr<MyClass> MyClassPtr;

class MyClass final : public boost::enable_shared_from_this<MyClass> {
public:
    /* ctors/dtor ommitted */

    MyClassPtr method1() {
         // does something
         return shared_from_this();
    };

    MyClassPtr method2() {
         // does something
         return shared_from_this();
    };

}; // eo class MyClass

これは、呼び出しを簡単に連鎖させたかったためです。

MyClassPtr ptr(myClassFactory.createMyClass());

ptr->method1()->method2()->methodX();  // etc...

shared_from_this()これはイディオムの適切な使用法ですか?私が知らない落とし穴はありますか、それともこれを行うためのより良い方法はありますか?

4

1 に答える 1

5

関数呼び出しチェーンは通常、オブジェクトへの参照を返すことによって行われます。

MyClass& method1() {
     // does something
     return *this;
};

を使用してそれを行うということは、 の唯一の使用法がでラップされることshared_ptrを期待していることを意味します。実際、誰かが自動保存期間を指定して を作成し、メソッドの 1 つを呼び出した場合、返されたが破棄されると、オブジェクトが試行されるため、問題が発生します。もちろん、自動保存期間を持つオブジェクトはできません。MyClassshared_ptrMyClassshared_ptrdeletedelete

私は通常enable_shared_from_this、クラスがそれ自体に s を生成する静的ファクトリ関数を提供してshared_ptrおり、そのコンストラクターがプライベートである場合にのみ使用する必要があると考えています。これにより、自動保存期間を持つこのタイプのオブジェクトを誰も作成できなくなります。

それにもかかわらず、ほとんどの人は、関数チェーンを行う場合、オブジェクトへの参照を期待します。次に、少なくとも彼らはこれを行うことができます:

MyClass foo;
foo.method1().method2();

それ以外の:

MyClass foo;
foo.method()->method2();
于 2013-03-01T09:51:15.510 に答える