Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么要使用此模板中的enable_shared_?_C++_C++11_Boost_Shared Ptr_C++ Standard Library - Fatal编程技术网

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,这正是我要问的!!这次你感觉到我了;)谢谢斯拉维克,这正是我要问的!!这次你感觉到我了;)