如何在构造函数体中而不是在定义中初始化变量

How do you initialize a variable in a constructor body and not in the defintion?

本文关键字:定义 初始化 变量 函数体      更新时间:2023-10-16

Win7-64位赛格温g++-std=gnu++11(4.8.3)

在下面的片段中,必须在调用slipInit之后初始化变量"partition"。编译器抱怨(哦,太痛苦了),除非我在定义中初始化分区(在":"之后)。我刚刚开始使用gnu++11,所以这是一个不幸的惊喜。有什么简单的解决方法吗?或者我必须创建另一个方法来进行初始化吗?

StringPartition::StringPartition(vector<string*>* vec, long debugFlags) 
                                : vec(*vec)
                            , debugFlags(debugFlags) {
      SlipCellBase::slipInit(SLIPALLOCATION, SLIPALLOCATION);
      partition = * new SlipHeader();
}; // StringPartition::StringPartition()
Error Message
error: uninitialized reference member 'StringPartition::partition' [-fpermissive]

由于您正在尝试初始化引用数据成员(由于C++11,您可以在构造函数的初始值设定项列表中或使用大括号或相等的初始值设置项),但它需要首先调用函数,因此您应该更喜欢智能指针而不是引用(前面的伪代码):

class StringPartition {
  public:
  StringPartition() {
      SlipCellBase::slipInit(SLIPALLOCATION, SLIPALLOCATION);
      partition.reset(new SlipHeader());
  }
  std::unique_ptr<SlipHeader> partition;
};

在C++14中,你甚至可以做得更好:

partition = std::make_unique<SlipHeader>();

不能在构造函数主体中"初始化"成员。您只能分配给他们。在构造函数主体开始执行之前,所有成员都肯定已经初始化——使用它们的默认构造函数,并且只有在可能的情况下(否则编译失败)。由于partition是一个引用,它必须初始化,并且不能默认初始化。

出现您的问题是因为SlipCellBase没有利用RAII,因此不适合21世纪的类内资源管理模式。你最好的选择可能是将partition设为std::unique_ptr<SlipHeader>,这样它就可以具有"未设置"的值,直到你准备好分配给它。当你的StringPartition超出范围时,std::unique_ptr<>的智能特性会帮你清理它。尽管如此,不要抱有幻想:这最终仍然是一个围绕糟糕设计的破解。