std :: enable_shared_from_this <> và đa kế thừa [trùng lặp]
Khi tôi cố gắng chạy mã này, tôi nhận được ngoại lệ 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();
}
Tôi muốn tạo cá thể của lớp C nhưng sau đó trả về B shared_ptr vì đó là những gì giao diện khác yêu cầu. Có cách nào để sửa mã này không? Tôi dường như không thể làm điều đó.
Trả lời
Theo như tôi biết thì bạn đang cố gắng thực hiện việc hoàn tác:
Kế thừa trong C ++ có nghĩa là bạn cũng bao gồm các thành viên giống nhau của các lớp cha. Tuy nhiên class C, điều đó có nghĩa là 2 lớp đã được tổ chức bởi a std::shared_ptr. Nhưng bằng sự kế thừa, bạn nói với trình biên dịch rằng C nên chứa các thể hiện con của Avà Bkhông được giữ bởi a std::shared_ptr. shared_from_thissẽ phàn nàn về thực tế này tại thời điểm chạy bởi một ngoại lệ ptr yếu kém.
Có lẽ bạn muốn C chỉ được nắm giữ bởi a std::shared_ptr, sau đó bạn có thể nhập mã đính kèm.
Nếu bạn chỉ muốn "up-cast" một trường hợp Ctức là sử dụng nó vì nó sẽ là một lớp của Bbạn, bạn có thể chỉ cần sử dụng a B&hoặc sử dụng std::shared_ptrvới out std::enables_shared_from_thishoặc chỉ trên hầu hết lớp.
#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();
}