std :: enable_shared_from_this <> e herança múltipla [duplicado]

Oct 05 2020

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

Superlokkus Oct 05 2020 at 15:28

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