использование std необязательно в сочетании с shared_ptr - PullRequest
0 голосов
/ 16 июня 2020

У меня есть два производных класса, как показано ниже. Это упрощенная версия дизайна, которая у меня есть прямо сейчас.

объекты класса A можно копировать, но они большие. Вот почему я использовал ссылку в конструкторе производного класса.

Я использовал shared_ptr для класса производного_2, чтобы сделать использование p_a необязательным. Я заметил, что также могу использовать std :: optional в конструкторе класса производного_2. Этим я могу намекнуть пользователю, что этот аргумент действительно является необязательным.

Учтите, что это упрощенная версия, и этот член p_a интенсивно используется во всех трех классах. Также std::shared_ptr<A&> a - не единственный аргумент конструктора в реальном примере. Буду признателен, если вы покажете мне, как правильно использовать здесь std :: optional.

Можно ли смешивать std :: optional с std :: shared_ptr?

class A
{
  int m_a;
public:
  A(int a) :m_a(a) {};
};


class Base
{
protected:
  std::shared_ptr<A> p_a;  //Do I need to change type of p_a???
public:
  Base() {};

  void print()
  {
    if (p_a)
      std::cout << "p_a is allocated\n";
  }
  void virtual check() = 0;
};


class derived_1 : public Base
{
public:
  derived_1(const A& a)
  {
    p_a = std::make_shared<A>(a);
  }
  void check() {};
};

class derived_2 : public Base
  {
  public:
    derived_2(std::shared_ptr<A&> a) //can I use std::optional instead??
      {
      if (a)
        p_a = a;
      }
    void check() {};
  };
...