У меня есть абстрактный базовый класс, назовем его Message и производный класс StatusMessage.
Класс-оболочка должен содержать shared_ptr для любого из производных классов сообщений.Сообщение получает назначение при создании.
StatusMessage status_message{"status"};
WrapperClass wrapper{"user", status_message};
Теперь мой вопрос: как я могу сделать shared_ptr внутри WrapperClass указывать на объект StatusMessage?Очевидно, что make_shared не будет работать, потому что он попытается создать объект абстрактного класса Message.
message_ptr = std::make_shared<Message>(status_message);
Использование ссылок вместо std_pointer, на мой взгляд, не вариант, потому что мои объекты Message конструируются в разныхклассы и будут уничтожены до уничтожения Wrapper.Вот почему я выбрал 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");