我有一个抽象基类,我们称其为Message,还有一个派生类,称为StatusMessage。
包装器类必须对任何派生的消息类都持有一个shared_ptr。该消息已在构造中分配。
StatusMessage status_message{"status"};
WrapperClass wrapper{"user", status_message};
现在我的问题是:如何使WrapperClass内的shared_ptr指向StatusMessage对象?显然make_shared不起作用,因为那样会尝试构造抽象Message类的对象。
message_ptr = std::make_shared<Message>(status_message);
在我看来,不是使用引用而不是std_pointer,因为我的Message对象是在不同的类中构造的,并且在销毁包装程序之前将被销毁。这就是为什么我选择了shared_ptr的原因。
提前谢谢!如有需要,随时询问更多信息。
结构概述:
class Message {
public:
virtual ~OcppMessage() {}
};
class StatusMessage : public Message {
public:
void doSomething();
};
class Wrapper {
public:
Wrapper();
private:
std::shared_ptr<Message> message_;
};
更新1
所以我现在正在尝试的是将派生的消息对象创建为共享指针,然后将它们分配给构造函数中的成员变量。我写了一个小型测试程序来展示这个想法,这似乎行得通。
std::shared_ptr<Message> base_ptr_;
auto status_message = std::make_shared<StatusMessage>("status");
base_ptr_ = status_message;
std::shared_ptr<StatusMessage> derived_ptr =
std::dynamic_pointer_cast<StatusMessage>(base_ptr_);
REQUIRE(derived_ptr->status == "status");