std :: enable_shared_from_this <> y herencia múltiple [duplicado]
Cuando intento ejecutar este código, obtengo la excepción 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();
}
Me gustaría crear una instancia de la clase C pero luego devolver B shared_ptr porque eso es lo que requiere otra interfaz. ¿Hay alguna forma de corregir este código? Parece que no puedo hacer eso.
Respuestas
Bueno, por lo que sé, estás intentando hacer lo que se puede deshacer:
La herencia en C ++ significa que también incluye los mismos miembros de las clases principales. Sin embargo, para class Ceso significaría 2 clases que ya se supone que debe llevar a cabo un std::shared_ptr. Pero por herencia le dice al compilador que C debe contener sub instancias de Ay Bno retenido por un std::shared_ptr. shared_from_thisse quejará de este hecho en tiempo de ejecución mediante una excepción ptr débil.
Probablemente desee que C esté retenido solo por a std::shared_ptr, luego puede hacerlo con el código adjunto.
Si simplemente desea "mejorar" una instancia de Cie, úsela como si fuera una clase de B, simplemente puede usar una B&o usar std::shared_ptrcon out std::enables_shared_from_thiso solo en la clase más alta.
#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();
}