Moo*_*ice 3 c++ boost shared-ptr
这可能是一个"最佳实践"问题,但我想确保我以正确的方式解决这个问题.
我有以下课程:
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()成语的合适用途吗?有没有我不知道的陷阱,或者有更好的方法吗?
函数调用链通常通过返回对象的引用来完成:
MyClass& method1() {
     // does something
     return *this;
};
使用shared_ptr它意味着你只希望将MyClass它包含在一个中shared_ptr.实际上,如果有人创建了一个MyClass具有自动存储持续时间并调用您的某个方法,那么您将遇到问题,因为当返回shared_ptr被销毁时,它将尝试delete您的对象.当然,你不能delete拥有自动存储持续时间的对象.
我通常认为enable_shared_from_this只有在你的类提供静态工厂函数来shared_ptr为自己生成s并且它的构造函数是私有的时才应该使用它.这可以防止任何人创建具有自动存储持续时间的此类对象.
尽管如此,如果他们要进行功能链接,大多数人都会期望对该对象的引用.那么至少他们可以做到这一点:
MyClass foo;
foo.method1().method2();
代替:
MyClass foo;
foo.method()->method2();