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]
答案 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
的聪明才能会为您清理它。尽管如此,不要有任何幻想:最终,这仍然是对糟糕设计的黑客攻击。