在尝试研究我的问题时,我已经阅读了很多有关stack_overflow的有关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_thisshared_ptr以及make_shared cannot detect继承,而该对象需要这种支持。不是因为继承了第三方类。

因此,要修复只作为公共(public)继承:

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

09-08 10:09