如何在构造函数中使用std :: optional?

时间:2019-06-07 15:29:58

标签: c++ constructor optional

我将std :: optional放在类的构造函数中。但是,当我创建该类的实例时,忽略了可选参数,就会收到错误消息,指出该类不存在此类构造函数。我想知道如何正确使用std :: optional。

“ Car”类的构造函数如下:

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 };
}

我希望使用optional可以使我在制作Car的新实例时不必提供副驾驶员。但是,这似乎并非如此,因为我遇到一个错误,即没有这样的构造函数。

3 个答案:

答案 0 :(得分:2)

您可以为该选项设置默认参数:

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 :(得分:1)

如果您想要函数或ctor的可选参数,请编写两个参数不同的参数,或使用默认参数(在可选参数名称后直接使用= whatever)。
这两个选项都与std::optional没有任何关系。

无论如何,当您使用std::optional<some_pointer_type>时,请注意,所有指针无论如何都可以为null。换句话说,它们都是std::optional<non_nullable_pointer>的实例。那么空指针与在您的情况下不获取指针有何不同?

顺便说一句,它是int main()

答案 2 :(得分:1)

对于您想做的事情,似乎可以在类的公共部分中设置默认值,如下所示(来自this问题的代码):

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)
    {
        ...
    }
};