tgo*_*art 8 c++ constructor boost shared-ptr weak-ptr
我理解通过从类的构造函数中调用shared_from_this()来获取shared_ptr是不可能的,因为该对象尚未构造.但是有可能从构造函数中获取对象的weak_ptr吗?一些提升论坛帖子讨论"weak_from_raw()"方法表明它可能是有可能的.
编辑:提升形式讨论weak_from_raw http://lists.boost.org/boost-users/2010/08/61541.php
Jam*_*mes 15
我想你所引用的是这个.似乎没有合并到boost版本(可能是错误的).
来自boost文档:
经常问的问题
问:一个对象可以在其构造函数中为自己创建一个weak_ptr吗?
A.了weak_ptr只能从一个shared_ptr创建,而在对象构造时间编号A没有shared_ptr的对象还不存在.即使你可以为此创建一个临时的shared_ptr,它也会超出构造函数末尾的范围,并且所有weak_ptr实例都会立即过期.
解决方案是使构造函数为私有,并提供返回shared_ptr的工厂函数:
class X
{
private:
X();
public:
static shared_ptr<X> create()
{
shared_ptr<X> px(new X);
// create weak pointers from px here
return px;
}
};
Run Code Online (Sandbox Code Playgroud)
请参阅:http://boost.org/doc/libs/1_42_0/libs/smart_ptr/sp_techniques.html#in_constructor
问题不在于没有构造对象.问题是尚未构建shared_ptr.如果您要做的就是创建一个shared_ptr并将其发送到某处,一切都会好的.当您尝试创建shared_ptr以包含刚刚创建的对象时.没有办法连接这两者,因此你有一个大问题.
shared_from_this的工作方式是,它希望您在调用shared_from_this之前将对象设置为shared_ptr以获取对它的访问权限.由于您尚未这样做,因为对象的构造函数尚未完成,因此shared_ptr未连接到它,您无法调用shared_from_this.
你对weak_ptr有完全相同的问题.
换句话说,这个荒谬的结构会起作用:
struct absurd
{
absurd()
{
register(shared_ptr<absurd>(this));
}
};
...
new absurd; // better not assign to a shared_ptr!!!
Run Code Online (Sandbox Code Playgroud)
但你真的不想这样做.
| 归档时间: |
|
| 查看次数: |
4544 次 |
| 最近记录: |