如何在构造函数体中而不是在定义中初始化变量
How do you initialize a variable in a constructor body and not in the defintion?
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<>
的智能特性会帮你清理它。尽管如此,不要抱有幻想:这最终仍然是一个围绕糟糕设计的破解。
相关文章:
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- Boost Python Numpy - 要初始化的未定义引用
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- C++类中的类作为自定义向量(如何初始化?
- 初始化类定义中的结构数组
- C++ 如何检查 char 变量是否未定义(未初始化)
- C++列表初始化允许多个用户定义的转换
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- (C++)我的自定义数组无法初始化(编译错误)
- 类模板静态数据成员定义/声明/初始化
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 在另一个文件中初始化的 extern 数组中未定义的引用
- thread_local静态成员模板定义:初始化失败,GCC
- 通过用户定义的转换初始化引用
- 自定义初始化数组与 std::make_unique
- C++具有自定义初始化的静态调度
- 导入错误:动态模块未定义初始化函数
- 有没有一种标准的方法可以在初始化阶段运行一些代码并定义初始化的顺序
- C++,为什么我不能把带有参数的类构造函数的定义-初始化列表放在类声明之外
- 是否需要在头文件中定义初始化列表