类中未初始化的常量成员

12

这可能是一个非常简单的问题,但我已经搜索了一段时间,但似乎无法弄清楚。我正在尝试在类中初始化一个常量变量常量指针。以下是头文件:

class Scheduler{
  public:
  Scheduler();
  explicit Scheduler( unsigned long * );

  private:
  const unsigned long *const thresh;

};

这是该类的构造函数

Scheduler::Scheduler( unsigned long * threshold ):
  thresh(threshold)
{}

当我尝试编译这段代码时,遇到了以下错误:

scheduler.cpp: In constructor ‘Scheduler::Scheduler()’:
scheduler.cpp:3: error: uninitialized member ‘Scheduler::thresh’ with ‘const’ type ‘const long unsigned int* const’

在线上多个来源讨论构造函数中常量成员变量时,都指向使用初始化列表。我认为我正在按照要求做,但显然仍然不好。有谁能看出问题在哪里吗?


你的代码似乎缺少默认构造函数的实现,这就是错误的根源所在。 - visitor
3个回答

17

所有构造函数的初始化列表中初始化常量成员。你目前只在带有参数的构造函数中这样做。请在默认构造函数中也进行初始化,这样一切都会很好。在这种特殊情况下,可以将thresh初始化为0,或者禁用默认构造函数。


6
问题出现在默认构造函数上,应该是:
Scheduler::Scheduler() : thresh(0) {}

或者根本没有被实现。


0

你的代码在我的MSVC2010上运行良好 - 我认为它应该如此。你正在尝试使用哪个编译器?
编译器可能/应该对代码唯一的抱怨是警告,由于const成员,无法创建自动复制构造函数和赋值运算符。


我认为你指的是VC++的“愚蠢警告”。警告这些事情并没有特别多的意义。 - visitor
当然,你的情况可能会有所不同;-) 但是,在我的答案中,我错过了默认构造函数 - 其他帖子的作者正确地指出需要初始化const成员。 - BuschnicK
那么我该如何解决这个警告呢?我继承自boost::noncopyable,以表明该类不应该是可复制/可赋值的...现在出现了两个新的警告:它也无法创建隐式复制构造函数!糟糕。 - UncleBens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接