首页 > 解决方案 > 从第三方定义的类继承时的 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;
}

标签: c++

解决方案


您收到错误是因为您不是从公共继承的enable_shared_from_thisshared_ptr并且make_shared 无法检测到该对象需要此类支持。不是因为从第三方类继承。

所以,修复只是继承为公共:

class A : public ThirdPartyClass, public std::enable_shared_from_this<A>

推荐阅读