我理解通过从类的构造函数中调用shared_from_this()来获取shared_ptr是不可能的,因为该对象尚未构造。但是有可能从构造函数中获取对象的weak_ptr吗?一些提升论坛帖子讨论“weak_from_raw()”方法表明它可能是可能的。
编辑:提升表格讨论weak_from_raw http://lists.boost.org/boost-users/2010/08/61541.php
答案 0 :(得分:15)
我认为你引用的是is this。这似乎没有被合并到提升版本(可能是错误的)。
来自boost docs:
常见问题解答
问。对象可以在构造函数中为自己创建一个weak_ptr吗?
A。否。只能从shared_ptr创建weak_ptr,并且在对象构造时,还没有到该对象的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;
}
};
答案 1 :(得分:5)
请参阅: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!!!
但你真的不想这样做。