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