【问题标题】:Is there a way to create instance that has no default constructor from another class constructor's body?有没有办法从另一个类构造函数的主体创建没有默认构造函数的实例?
【发布时间】:2021-06-06 18:53:21
【问题描述】:

我正在尝试从另一个类的构造函数创建一个没有默认构造函数的类实例,但没有将它们作为类初始值设定项传递。这是我正在尝试做的示例代码:

class Device {
public:
  Device(const PhysicalDevice& device) { ... }
};

class Renderer {
public:
  Renderer() {
    auto physicalDevice = getPhysicalDevice();
    device = Device(physicalDevice); // <-- this causes me a problem
  }

  PhysicalDevice getPhysicalDevice();

  Device device;
};

因为我创建了一个Device对象并赋值给成员变量device,所以我将临时对象复制到成员变量中,也就是说临时对象需要销毁。

有没有办法摆脱临时对象,直接初始化设备?

【问题讨论】:

    标签: c++


    【解决方案1】:

    您可以使用 mem-initializer 列表编写,例如:

    class Renderer {
    public:
      Renderer() : device( getPhysicalDevice() ) {
      }
    
      PhysicalDevice getPhysicalDevice();
    
      Device device;
    };
    

    至于你的构造函数定义那么在这个语句中:

    device = Device(physicalDevice);
    

    假设在将控制权传递给构造函数主体之前,已经使用默认构造函数(未定义)创建了数据成员设备。所以编译器会报错。

    【讨论】:

    • 我认为弗拉德的意思是getPhysicalDevice()
    • 我希望有另一种方法可以做到这一点,因为这是一个例子。在某些情况下,我想创建一个变量,将其设置为另一个成员,然后将该成员用作另一个成员变量的参数。比如,如果physicalDevice 也是一个成员变量呢?我想我要在我的设备函数中添加一个像 setPhysicalDevice 这样的函数。
    • @Gasim 这是可能的,如果你按照需要初始化的顺序声明变量。
    【解决方案2】:

    为构造函数使用初始化列表

    Renderer()
        : device{ getPhysicalDevice() }
    {
        /* Empty */
    }
    

    这将用于初始化device 对象,而不是让它被默认初始化然后分配给它。

    【讨论】:

      猜你喜欢
      • 2018-02-23
      • 2023-03-20
      • 2017-10-20
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 2015-03-19
      相关资源
      最近更新 更多