std :: enable_shared_from_this <> 및 다중 상속 [중복]

Oct 05 2020

이 코드를 실행하려고하면 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();
}

C 클래스의 인스턴스를 만들고 싶지만 다른 인터페이스가 필요하기 때문에 B shared_ptr을 반환합니다. 이 코드를 수정하는 방법이 있습니까? 나는 그렇게 할 수없는 것 같습니다.

답변

Superlokkus Oct 05 2020 at 15:28

내가 아는 한 당신은 실행 취소를 시도하고 있습니다.

C ++의 상속은 부모 클래스의 동일한 멤버도 포함 함을 의미합니다. 그러나 class C그것은 이미 std::shared_ptr. 그러나 상속에 의해 당신은 C가의 하위 인스턴스를 포함해야 컴파일러 말할 A와 Ba로지지하지 std::shared_ptr. shared_from_this런타임에 나쁜 약한 ptr 예외로 인해이 사실에 대해 불평합니다.

아마도 당신은 C가으로 만 잡기를 원할 것 std::shared_ptr입니다. 그러면 첨부 된 코드를 사용할 수 있습니다.

당신은 단순히하려는 경우 "최대 캐스트"의 예 C는의 클래스가 될 것 같은 즉 사용 B하면 간단하게 사용할 수 있습니다 B&또는 사용을 std::shared_ptr밖으로 std::enables_shared_from_this또는 단지까지 대부분의 클래스.

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