我来自c# / scala / java世界,最近正在c++上发展,因此,如果这是一个愚蠢的问题,请原谅。

当我在类中声明一个成员变量时,应在运行时的某个时刻对其进行初始化。例如,如果成员变量包装了用户必须为其指定地址的网络设备的功能。用户输入地址后,我将创建DeviceWrapper实例。我的课看起来像这样:

class A
{
public:
  //Method to instantiate dev and other stuff
private:
  DeviceWrapper dev;
}

在声明成员变量时,据我了解,如果我未在DeviceWrapper的构造函数中显式调用它,则将调用默认的A构造函数。但是,对于DeviceWrapper类,没有默认构造函数是没有意义的,因为该类在不知道要包装的设备地址的情况下是没有意义的。

我是否在这里遗漏了某些东西,还是C++迫使我在DeviceWrapper中定义无意义的默认构造函数,还是使该类可变,以便包装器在创建后可以接收其地址?

另一种选择是使dev指向DeviceWrapper的指针。
我使用对象的指针的想法是拥有实例的对象直接拥有该实例,而使用它但不拥有该实例的所有其他对象都获得了指向该实例的指针。如果我将dev定义为DeviceWrapper* dev;,这个概念将被打破。

那么,解决该问题的C++解决方案将是什么?

最佳答案

最简单的解决方案是将DeviceWrapper包装为以下之一:

std::optional<DeviceWrapper> dev;
std::unique_ptr<DeviceWrapper> dev;
std::shared_ptr<DeviceWrapper> dev;

这三者都将允许您在构造DeviceWrapper dev之后初始化A。它们都有不同的复制语义,因此您需要选择哪种对您的应用程序有意义。

10-06 14:30