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

时间:2014-11-05 15:01:16

标签: c++ c++11

Win7-64位 cygwin的 g ++ -std = gnu ++ 11(4.8.3)

在变量'分区'下面的片段中必须在调用slipInit后初始化。除非我在定义中初始化分区(在':'之后),否则编译器会抱怨(哦,这么痛苦)。我刚刚开始使用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]

2 个答案:

答案 0 :(得分:2)

因为你正在尝试初始化reference data member(因为C ++ 11你可以在构造函数的初始化列表中使用或者使用大括号或者大小写),但它需要先调用函数,你应该比引用更喜欢smart pointer提前伪代码):

class StringPartition {
  public:

  StringPartition() {
      SlipCellBase::slipInit(SLIPALLOCATION, SLIPALLOCATION);
      partition.reset(new SlipHeader());
  }

  std::unique_ptr<SlipHeader> partition;
};

在C ++ 14中you could even do better

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

答案 1 :(得分:0)

无法&#34;初始化&#34;构造函数体中的成员。您只能分配给他们。所有成员都可以使用默认构造函数进行初始化,并且只有在可能的情况下(否则编译失败) - 才能在构造函数体的执行开始之前进行初始化。由于partition是引用,因此必须初始化,并且不能默认初始化。

您的问题已经出现,因为SlipCellBase没有利用RAII,因此不适合21世纪的课堂资源管理模式。您最好的选择可能是让partition成为std::unique_ptr<SlipHeader>,以便它可以承担&#34;未设置&#34;值,直到您准备好分配给它。当std::unique_ptr<>超出范围时,StringPartition的聪明才能会为您清理它。尽管如此,不要有任何幻想:最终,这仍然是对糟糕设计的黑客攻击。