将调用与共享指针链接在一起
Chaining calls together with shared pointers
这可能是一个"最佳实践"问题,但我想确定我是在正确的方式。
我有以下类:
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();
相关文章:
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- 在C 中,我如何在下面的示例中成功将类别链接在一起
- 如何构建库并将其与Make链接在一起
- 在C++中,我们如何将插入运算符和其他运算符链接在一起
- 将MBCS和Unicode库链接在一起
- Visual Studio,将项目链接在一起并进行测试
- Visual Studio 2010 默认属性表似乎在调试和发布配置下都链接在一起,这是怎么回事?
- 有没有办法在Visual Studio中将来自不同解决方案的类链接在一起
- 将问题与多个文件链接在一起
- 不同的海湾合作委员会方言可以链接在一起吗?
- 将几个LLVM C++模块链接在一起会在lli中产生segfault
- 分别创建目标文件,然后在Makefile中将它们链接在一起的目的是什么?< / h1 >
- Netbeans/C++:将2个项目链接在一起(可执行文件/动态库)
- 将可变模板链接在一起
- 当我将两个头文件链接在一起时,其中一个无法识别另一个
- 将调用与共享指针链接在一起
- 有没有办法从 ELF 中提取符号,并使用 LD 将另一个文件与上一个 ELF 中定义的符号链接在一起
- 我可以在 IF 语句中将比较链接在一起吗?
- 创建一个简单的"hello world"并将其与 2 个预编译对象链接在一起
- 具有模板的对象文件如何链接在一起