将调用与共享指针链接在一起

Chaining calls together with shared pointers

本文关键字:链接 在一起 指针 共享 调用      更新时间:2023-10-16

这可能是一个"最佳实践"问题,但我想确定我是在正确的方式。

我有以下类:

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并且它的构造函数是私有的情况下使用。这可以防止任何人创建具有自动存储时间的这种类型的对象。

尽管如此,如果要进行函数链,大多数人会期望是对对象的引用。那么至少他们可以这样做:
MyClass foo;
foo.method1().method2();

代替:

MyClass foo;
foo.method()->method2();