C++ 为什么要使用此模板中的enable_shared_?
最近我遇到了这个模板中的C++ 为什么要使用此模板中的enable_shared_?,c++,c++11,boost,shared-ptr,c++-standard-library,C++,C++11,Boost,Shared Ptr,C++ Standard Library,最近我遇到了这个模板中的std::enable_shared_,它与它的版本相同。 因此,它描述了以下示例代码: class Y: public enable_shared_from_this<Y> { public: shared_ptr<Y> f() { return shared_from_this(); } } int main() { shared_ptr<Y> p(new Y); shar
std::enable_shared_,它与它的版本相同。
因此,它描述了以下示例代码:
class Y: public enable_shared_from_this<Y>
{
public:
shared_ptr<Y> f()
{
return shared_from_this();
}
}
int main()
{
shared_ptr<Y> p(new Y);
shared_ptr<Y> q = p->f();
assert(p == q);
assert(!(p < q || q < p)); // p and q must share ownership
}
Y类:公共启用\u共享\u
{
公众:
共享_ptr f()
{
从_this()返回共享的_;
}
}
int main()
{
共享ptr p(新Y);
共享_ptr q=p->f();
断言(p==q);
断言(!(p
通过f()创建共享\u ptr的原因是什么?
shared\u ptr p(新Y)有什么问题代码>
共享的ptr p(新Y)有什么问题
它没有什么问题,只是您可能没有将它放在类Y
的成员中,有时您希望成员将std::shared_ptr
返回到自身std::shared_ptr(this)
显然是一种错误的创建方法
我想知道这样的例子是否能让事情变得更清楚,并且仍然足够简单:
std::shared_ptr<Y> Y::getObject()
{
return some_condition ? shared_from_this() : std::make_shared<Y>( somedata );
}
std::shared\u ptr Y::getObject()
{
从_this()返回一些_条件?shared_:std::make_shared(somedata);
}
共享的ptr p(新Y)有什么问题
它没有什么问题,只是您可能没有将它放在类Y
的成员中,有时您希望成员将std::shared_ptr
返回到自身std::shared_ptr(this)
显然是一种错误的创建方法
我想知道这样的例子是否能让事情变得更清楚,并且仍然足够简单:
std::shared_ptr<Y> Y::getObject()
{
return some_condition ? shared_from_this() : std::make_shared<Y>( somedata );
}
std::shared\u ptr Y::getObject()
{
从_this()返回一些_条件?shared_:std::make_shared(somedata);
}
此
的共享的要点是,当您还没有访问共享的ptr时,您可以获得一个共享的ptr
。这在你的例子中是毫无意义的,因为你的例子太简单了。假设有一个函数只得到一个Y*
或一个Y&
,它需要与某人共享所有权。这经常发生在Y
的成员身上,因为成员只能访问This
此共享的意义在于,当您还没有访问权限时,允许您获得共享的ptr
。这在你的例子中是毫无意义的,因为你的例子太简单了。假设有一个函数只得到一个Y*
或一个Y&
,它需要与某人共享所有权。这种情况经常发生在<代码> y>代码>中,因为成员只能访问<代码> < <代码> > 未命名的和看不见的下一个投票者,请考虑把一个称呼不是我,但我不确定你们在问什么。您可以在共享指针中使用新的'd'变量。您需要这个实例方法来获取共享引用计数的内容:这是一个糟糕的示例,因为您可以只使用auto q=p
@EduardRostomyan您不需要从这里共享<代码>标准::共享_ptr q=p代码>在这里很好shared_from_此
仅当您需要一个shared_ptr
到一个已由shared_ptr
拥有的实例时才相关,但您不能直接访问该指针的副本。@Eljay“一个学派是另一个学派”说,如果一个对象是“自我意识的”,这应该是一个很好的理由,因为设计意味着,它应该是类的一个不变量(我们称之为托管的
),然后从共享的
这个
是脆弱和不充分的,您应该提供一个工厂函数来创建对象(使
)不允许通过<代码>新< /代码>或自动或静态对象或成员。未命名和不可见的下级选民,请考虑把一个不是我的,但我不知道你的要求。您可以在共享指针中使用新的'd'变量。您需要这个实例方法来获取共享引用计数的内容:这是一个糟糕的示例,因为您可以只使用auto q=p
@EduardRostomyan您不需要从这里共享<代码>标准::共享_ptr q=p代码>在这里很好shared_from_此
仅当您需要一个shared_ptr
到一个已由shared_ptr
拥有的实例时才相关,但您不能直接访问该指针的副本。@Eljay“一个学派是另一个学派”说,如果一个对象是“自我意识的”,这应该是一个很好的理由,因为设计意味着,它应该是类的一个不变量(我们称之为托管的
),然后从共享的
这个
是脆弱和不充分的,您应该提供一个工厂函数来创建对象(使
)不允许通过new
或自动或静态对象或成员进行构造。谢谢Slavik,这正是我要问的!!这次你感觉到我了;)谢谢斯拉维克,这正是我要问的!!这次你感觉到我了;)