shared_ptr абстрактного базового класса в качестве члена - PullRequest
1 голос
/ 18 марта 2019

У меня есть абстрактный базовый класс, назовем его 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");
...