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

标签 c++ c++11

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]

最佳答案

由于您正在尝试初始化 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>();

关于c++ - 如何在构造函数体中而不是在定义中初始化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26760301/

相关文章:

c++ - MFC 资源 ID 和 Squish

c++ - C++ 中运算符返回的引用和 const 引用

c++ - 在 std::thread 中等待条件 A 或条件 B

c++ - 函数成员中的 enable_if 用于 void 和继承

C++11 numeric_limits<long>::min() 的abs();

c++ - 为什么 Windows 在我使用 ** 时将我的目录列表注入(inject)到 argv 中?

c++ - 解析制表符分隔的数据

c++ - 如何归还或护理项目 list 基于几个类别

c++11 - 如何允许派生类通过虚拟方法返回类型上的任何迭代器?

c++ - 如何在只有 protected 或私有(private)构造函数的类上调用::std::make_shared?