std :: enable_shared_from_this <> y herencia múltiple [duplicado]

Oct 05 2020

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

Superlokkus Oct 05 2020 at 15:28

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();
}