Как я могу использовать std :: option в конструкторе? - PullRequest
2 голосов
/ 07 июня 2019

Я поместил std :: option в конструктор класса. Но когда я делаю экземпляр этого класса, опуская необязательный аргумент, я получаю ошибку, что такого конструктора для этого класса не существует. Я хотел бы знать, как правильно использовать std :: необязательный.

Конструктор для моего класса 'Автомобиль' выглядит так:

Car::Car(string make, string model, Racer *driver, optional<Racer*> codriver) : m_make(make), m_model(model), m_driver(driver), m_codriver(codriver)
{
}

Вот как выглядит моя главная:

void main()
{
    Racer *r1 = new Racer{ "John Doe", "male", "08/05/1987", "Ford" };
    Racer *r2 = new Racer{ "Jane Doe", "male", "06/09/1990", "Ford" };
    Racer *r3 = new Racer{ "Howard", "male", "18/04/1985", "Dodge" };

    Car c1{ "Ford", "Mustang GT350R", r1, r2 };
    Car c2{ "Dodge", "Challenger SRT Hellcat RedEye", r3 };
}

Я ожидал, что использование опционально позволит мне не предоставлять штурмана при создании нового экземпляра автомобиля. Однако, похоже, это не так, поскольку я получаю сообщение об ошибке, что такого конструктора нет.

Ответы [ 3 ]

2 голосов
/ 07 июня 2019

Вы можете установить аргумент по умолчанию для опции:

Car(string make, string model, Racer *driver, optional<Racer*> codriver=std::nullopt) 
   : m_make(make), m_model(model), m_driver(driver), m_codriver(codriver) { }

Но, как сказал Deduplicator, это также можно сделать, используя указатели в качестве типа параметра (null / not-null):

Car(string make, string model, Racer *driver, Racer* codriver=nullptr) 
   : m_make(make), m_model(model), m_driver(driver), m_codriver(codriver) { }
1 голос
/ 07 июня 2019

Для того, что вы хотите сделать, похоже, что установка значения по умолчанию в публичном разделе вашего класса должна работать, как показано ниже (код взят из this question):

class foo  
{
private:
    std::string name_;
    unsigned int age_;
public:
    foo() :
    name_(""),           // Set your default values here
    age_(0)
{
}

foo(const std::string& name, const unsigned int age) :
        name_(name),
        age_(age)
    {
        ...
    }
};
1 голос
/ 07 июня 2019

Если вам нужен необязательный аргумент для функции или ctor, либо напишите два, которые отличаются по арности, либо используйте аргумент по умолчанию (= whatever непосредственно после имени необязательного параметра).
Ни одна из опций не имеет ничего общего сделать с std::optional.

В любом случае, когда вы используете std::optional<some_pointer_type>, помните, что все указатели могут быть нулевыми в любом случае.Или, другими словами, все они являются экземплярами std::optional<non_nullable_pointer>.Так чем же отличается нулевой указатель от получения указателя в вашем случае?

В целом, это int main().

...