C++ 如何从属于同一模板实例的父类调用方法[boost::enable_shared_from_this]
我有以下代码C++ 如何从属于同一模板实例的父类调用方法[boost::enable_shared_from_this],c++,boost,C++,Boost,我有以下代码 class A: public boost::enable_shared_from_this<A> { public: virtual ~A() {} boost::shared_ptr<A> returnMe() { return shared_from_this(); } }; class B: public A, public boost::enable_shared_from_this<B> {
class A: public boost::enable_shared_from_this<A> {
public:
virtual ~A() {}
boost::shared_ptr<A> returnMe() {
return shared_from_this();
}
};
class B: public A, public boost::enable_shared_from_this<B> {
boost::shared_ptr<B> returnMe() {
return shared_from_this();
}
};
class A:public boost::从此\u启用\u共享\u{
公众:
虚拟~A(){}
boost::sharedptrreturnme(){
从_this()返回共享的_;
}
};
B类:公共A,公共boost::从\u中启用\u共享\u{
boost::sharedptrreturnme(){
从_this()返回共享的_;
}
};
gcc抱怨来自于此的共享\u不明确。
*在这种情况下,使用boost::enable_shared_from_this::shared_from_this()
或
this->boost::从\u this::shared\u from\u this()启用\u shared\u
作为B的回报?
*从中继承的A和B都使用不同的参数从中启用\u共享\u。这似乎正确吗?还是我需要做点别的?
如果B没有继承启用来自\u this的\u共享\u,则在B中使用shared\u from\u this()
将返回shared\u ptr
。如果是这样,将静态\u指针\u转换为共享\u ptr
是否安全?您是否尝试更改为从\u this::从\u this()返回启用\u共享\u之类的内容代码>?有两个基提供了此
的共享,但基的类型不同,因此您可以使用这两个基来消除歧义:
shared_ptr<B> returnMe() {
return static_cast<boost::enable_shared_from_this<B>*>(this)->shared_from_this();
}
shared\ptr returnMe(){
返回static_cast(this)->shared_from_this();
}
这就是说,设计可能比您想要的要复杂一些,特别是returnMe
不是一个虚拟函数(也不能是不同的非协变返回类型),这意味着如果您将B
传递给一个引用或指针指向a
的函数,并且它们从\u this()调用shared\u
它将获取错误版本的对象
虽然shared_ptr
支持别名,并且没有任何技术原因,但接口不支持配置enable_shared_from_this
以生成shared_ptr
,该ptr可以与管理整个对象的shared_ptr
共享所有权
如果您可以使基础纯虚拟(从这个
中删除enable_shared_和returnMe
函数),那么您将拥有一个更干净的界面,更少混淆可能的工作方式和方式。对于您的修复,boost::static_pointer_cast(boost::static_pointer_cast(b)->returnMe())是否等于b->returnMe()?b是b的对象。他们是否真的将共享PTR返回到同一个obj并共享同一个参考计数器?