c++ - 使用共享指针将调用链接在一起

标签 c++ boost shared-ptr

这可能是一个“最佳实践”问题,但我想确保我以正确的方式解决这个问题。

我有以下类(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/

相关文章:

c++ - 将巨大的 boost dynamic_bitset vector 写入文件并将其读回的有效方法

boost - 尝试将 Ubuntu 10.10 上的 Boost 1.46.1 交叉编译到 Arm Linux

c++ - 为什么 boost::shared_array 的显式构造函数会导致错误?

c++ - 为什么 make_unique 和 make_shared 使用括号而不是大括号?

c++ - 将 C++ union 结构转换为 VB6

c++ - 具有相对路径的 CFileDialog

java - JNI 中的日期问题

c++ - 在 C++ 中,结构上的 "new/delete"代替 "malloc/free"有多好?

c++ - 谁拥有 MySQL Connector C++ 返回的内存?

c++ - ntdll.dll [下面的框架可能不正确/缺失,没有为 ntdll.dll 加载符号]