c++ - 从第三方定义的类继承时的 shared_from_this
问题描述
在尝试研究我的问题时,我已经阅读了许多有关 shared_from_this、bad_weak_ptr 异常和多重继承的堆栈溢出文章。他们都建议您从 enable_shared_from_this 继承一个基类,然后从中派生。好吧,当您必须从中派生的类是来自您无法编辑的第三方库时,该怎么办?
例子:
#include <iostream>
#include <memory>
class ThirdPartyClass
{
public:
ThirdPartyClass() {}
ThirdPartyClass(const ThirdPartyClass &) = delete;
virtual ~ThirdPartyClass() {};
};
class A : public ThirdPartyClass, std::enable_shared_from_this<A>
{
public:
A():ThirdPartyClass(){}
virtual ~A(){}
void Foo();
};
void DoStuff(std::shared_ptr<A> ptr)
{
std::cout << "Good job if you made it this far!" << std::endl;
}
void A::Foo()
{
DoStuff(shared_from_this()); // throws here
}
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
a->Foo();
return 0;
}
解决方案
您收到错误是因为您不是从公共继承的enable_shared_from_this
,shared_ptr
并且make_shared
无法检测到该对象需要此类支持。不是因为从第三方类继承。
所以,修复只是继承为公共:
class A : public ThirdPartyClass, public std::enable_shared_from_this<A>
推荐阅读
- html - 在 asp.core razor 页面中设置所选项目
- java - 改造 OkHttp HttpLoggingInterceptor 显示正确响应,但改造显示不正确响应
- haskell - 如何在 Haskell 中使用 IO Double 作为常规 Double
- php - 如何从 0 索引开始将字符串放入数组中
- hive - hive 或 pyspark 订单问题
- c - 用指针在 C 中编辑我的结构
- javascript - 如何使用 React js 获取嵌套的 json 对象
- javascript - Javascript 查询
- java - Jgroups 简单聊天应用程序在外部网络或两个不同子网中进行点对点通信
- php - 使用php和ajax提交html表单