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_ptrto 意味着您希望唯一的用途是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();
于 2013-03-01T09:51:15.510 回答