如何在super和subclass中使用std::enable_shared_from_this



我有两个类AB,其中BA的子类。我需要两个类都使用std::enable_shared_from_this

我试过这个:

#include <memory>
#include <iostream>
#include <vector>

class A : public std::enable_shared_from_this<A> {
public:
void insertme(std::vector<std::shared_ptr<A>>& v) {
std::cout << "A::insertmen";
v.push_back(shared_from_this());
std::cout << "OKn";
}
};
class B : public A, public std::enable_shared_from_this<B> {
public:
void insertme(std::vector<std::shared_ptr<B>>& v) {
std::cout << "B::insertmen";
v.push_back(std::enable_shared_from_this<B>::shared_from_this());
std::cout << "OKn";
}
};
int main()
{
std::vector<std::shared_ptr<A>> va;
std::vector<std::shared_ptr<B>> vb;
std::shared_ptr<A> pa = std::make_shared<A>();
std::shared_ptr<B> pb = std::make_shared<B>();
pa->insertme(va);
pb->insertme(vb);
}

(为了避免shared_from_this()不明确,我必须在B::insertme中完全限定它。(

当我运行上面的程序时,我得到的输出是:

A::insertme
OK
B::insertme
terminate called after throwing an instance of 'std::bad_weak_ptr'
what():  bad_weak_ptr
Aborted (core dumped)

所以A::insertme有效,但B::insertme无效。

我在Linux下使用GCC 9.1.0。

我做错了什么?

您只需要(并且只能(从基类中的shared_from_this继承

class A : public std::enable_shared_from_this<A> {
public:
void insertme(std::vector<std::shared_ptr<A>>& v) {
std::cout << "A::insertmen";
v.push_back(shared_from_this());
std::cout << "OKn";
}
};
class B : public A {
public:
void insertme(std::vector<std::shared_ptr<B>>& v) {
std::cout << "B::insertmen";
v.push_back(std::static_pointer_cast<B>(shared_from_this()));
std::cout << "OKn";
}
};

这意味着你需要显式的static_pointer_cast来获得shared_ptr<B>,但如果你想的话,你可以在B中把它包装成一个覆盖:

std::shared_ptr<B> shared_from_this() { return std::static_pointer_cast<B>(A::shared_from_this()); }

只有当类类型T恰好继承了一个明确的公共enable_shared_from_this基时,创建shared_ptr<T>时设置的到enable_shared_from_this<X>的自动链接才有效。但CCD_ 17继承了两个不同的CCD_。

相反,您可以只使用enable_shared_from_this<A>,并编写一个使用A::shared_from_this():的自定义B::shared_from_this()

class B : public A {
public:
// These hide the A::shared_from_this(), but they can still be
// used by qualification if wanted.
std::shared_ptr<B> shared_from_this()
{ return std::static_pointer_cast<B>(A::shared_from_this()); }
std::shared_ptr<const B> shared_from_this() const
{ return std::static_pointer_cast<B>(A::shared_from_this()); }
// ...
};

相关内容

  • 没有找到相关文章

最新更新