【问题标题】:Uninitialized constant members in classes类中未初始化的常量成员
【发布时间】:2010-12-03 17:08:18
【问题描述】:

这可能是一个非常简单的问题,但我一直在寻找答案,但似乎无法弄清楚。我正在尝试在一个类中初始化一个常量变量常量指针。这是头文件:

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’

在线讨论成员变量的构造函数中的常量成员变量的多个来源都指向使用初始化列表。我想我正在做我应该做的,但显然它仍然没有好处。任何人都可以看到有什么问题吗?

【问题讨论】:

  • 您的代码似乎缺少默认构造函数的实现,这是错误的来源。

标签: c++


【解决方案1】:

您必须在 ALL 构造函数的初始化列表中初始化常量成员。您只为有论据的人这样做。对默认的也这样做,一切都会好起来的。在这种特殊情况下,要么用 0 初始化你的 thresh,要么禁用默认构造函数。

【讨论】:

    【解决方案2】:

    问题出在默认构造函数上,应该是

    Scheduler::Scheduler() : thresh(0) {}
    

    或根本不实施。

    【讨论】:

      【解决方案3】:

      您的代码适用于我 (MSVC2010) - 我相信它应该如此。你用什么编译器试试这个?
      编译器可能/应该对代码的唯一抱怨是由于 const 成员而无法创建自动复制构造函数和赋值运算符的警告。

      【讨论】:

      • 我认为您指的是 VC++ 的“愚蠢警告”。警告这些事情并没有多大意义。
      • 您的里程当然可能会有所不同;-) 不过,我的回答中缺少默认的 ctor - 其他发帖人说也需要初始化 const 成员是正确的。
      • 那么我该如何解决这个警告呢?我从boost::noncopyable 继承来表明该类不应该是可复制/可分配的......两个新警告:现在它也不能创建隐式复制构造函数!哦。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      相关资源
      最近更新 更多