我将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的新实例时不必提供副驾驶员。但是,这似乎并非如此,因为我遇到一个错误,即没有这样的构造函数。
答案 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)
{
...
}
};