std :: enable_shared_from_this <> e herança múltipla [duplicado]
Quando tento executar este código, recebo a exceção bad_weak_ptr:
using namespace std;
class O {
public:
O() {}
};
class A : public std::enable_shared_from_this<A>, virtual public O {
public:
A() {}
};
class B : public std::enable_shared_from_this<B>, virtual public O {
public:
B() {}
void GetShared() {
shared_from_this();
}
};
class C : public A, public B {
public:
C() {}
};
int main()
{
std::shared_ptr<B> pt = std::make_shared<C>();
pt->GetShared();
}
Eu gostaria de criar uma instância da classe C, mas depois retornar B shared_ptr porque é isso que outra interface requer. Existe uma maneira de corrigir esse código? Não consigo fazer isso.
Respostas
Bem, pelo que eu sei, você está tentando fazer o que pode ser desfeito:
Herança em C ++ significa que você também inclui os mesmos membros das classes pai. No entanto, class Cisso significaria 2 aulas que já deveriam ser ministradas por a std::shared_ptr. Mas pela herança, você diz ao compilador que C deve conter sub-instâncias de a Ae Bnão mantida por a std::shared_ptr. shared_from_thisirá reclamar sobre este fato em tempo de execução por uma exceção ptr fraca ruim.
Provavelmente você deseja que C seja mantido apenas por a std::shared_ptr, então você pode para o código anexado.
Se você simplesmente deseja "fazer up-cast" de uma instância de Cie, use-a como seria uma classe de, Bvocê pode simplesmente usar a B&ou usar std::shared_ptrsem std::enables_shared_from_thisou apenas na maioria das classes.
#include <memory>
using namespace std;
class O {
public:
O() {}
};
struct A : virtual public O {
};
struct B : virtual O {
B() {}
void GetShared() {
}
};
struct C : std::enable_shared_from_this<C>, A, B {
C() = default;
};
int main()
{
std::shared_ptr<B> pt = std::make_shared<C>();
pt->GetShared();
}