У меня есть два производных класса, как показано ниже. Это упрощенная версия дизайна, которая у меня есть прямо сейчас.
объекты класса 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() {};
};