这可能是一个“最佳实践”问题,但我想确保我以正确的方式解决这个问题。
我有以下类(class):
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
被销毁时,它将尝试删除
您的对象。当然,您不能删除
具有自动存储持续时间的对象。
我通常认为 enable_shared_from_this
应该仅在您的类提供静态工厂函数来为自身生成 shared_ptr
并且其构造函数是私有(private)的情况下使用。这可以防止任何人创建具有自动存储持续时间的此类对象。
尽管如此,如果大多数人要进行函数链接,他们会期望对对象的引用。那么至少他们可以做到这一点:
MyClass foo;
foo.method1().method2();
代替:
MyClass foo;
foo.method()->method2();
关于c++ - 使用共享指针将调用链接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15154688/