如何在构造函数中使用 std::optional?
How do I use std::optional in a constructor?
我把std::optional放在class的构造函数中。但是,当我创建 class 的实例时,省略了可选参数,我得到的错误是 class 不存在这样的构造函数。我想知道如何正确使用 std::optional.
我的 class '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 的新实例时不必提供副驾驶。然而,情况似乎并非如此,因为我收到一个错误,指出没有这样的构造函数。
如果你想要一个函数或 ctor 的可选参数,要么写两个不同的参数,要么使用 default-argument(= whatever
直接在可选的 parameter-name 之后)。
这两个选项都与 std::optional
.
无关
无论如何,当您使用std::optional<some_pointer_type>
时,请注意所有指针都可以为空。或者换句话说,它们都是 std::optional<non_nullable_pointer>
的实例。那么在您的情况下,空指针与没有指针有何不同?
顺便说一句,它是 int main()
。
对于您想做的事情,似乎在 class 的 public 部分设置默认值应该可行,如下所示(代码取自 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)
{
...
}
};
您可以为选项设置默认参数:
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) { }
我把std::optional放在class的构造函数中。但是,当我创建 class 的实例时,省略了可选参数,我得到的错误是 class 不存在这样的构造函数。我想知道如何正确使用 std::optional.
我的 class '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 的新实例时不必提供副驾驶。然而,情况似乎并非如此,因为我收到一个错误,指出没有这样的构造函数。
如果你想要一个函数或 ctor 的可选参数,要么写两个不同的参数,要么使用 default-argument(= whatever
直接在可选的 parameter-name 之后)。
这两个选项都与 std::optional
.
无论如何,当您使用std::optional<some_pointer_type>
时,请注意所有指针都可以为空。或者换句话说,它们都是 std::optional<non_nullable_pointer>
的实例。那么在您的情况下,空指针与没有指针有何不同?
顺便说一句,它是 int main()
。
对于您想做的事情,似乎在 class 的 public 部分设置默认值应该可行,如下所示(代码取自 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)
{
...
}
};
您可以为选项设置默认参数:
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) { }