【问题标题】:static members and consts [closed]静态成员和常量 [关闭]
【发布时间】:2010-09-13 20:18:21
【问题描述】:
class a
{
protected:
  const int _ID;

public:
  a::a(int id){};
  a::top(int num);
};

class b : public a
{
  static int ok;
  b::b(int id):a(id){};
  a::top(ok);
}

int main()
{
  int t=5;
  b opj=b(t);
}

首先为什么我得到这个编译错误,只有当我删除 const 时才能解决

非静态常量成员‘const int Student::_ID’,不能使用默认赋值运算符 - 从'void std::vector::_M_insert_aux(__gnu_cxx::__normal_iterator, const _Tp&) [with _Tp = Student, _Alloc = std::allocator]'实例化

我有另一个问题

对 b::ok 的未定义引用

【问题讨论】:

  • 请保持体面,并以易于阅读的方式格式化您的源代码。这也适用于问题文本本身。
  • @Jim Brissom:让 Mati 松懈一些——看起来他/她是一个新用户。更好的是,帮助进行格式化,以便他/她可以看到它。 @mati:这是格式参考:[stackoverflow.com/editing-help
  • @Otaku 不,他只是不关心真正的答案,或者他只是取笑 SO 用户或两者兼而有之。看看他的其他问题。我不会浪费时间教巨魔如何按下“格式化”按钮。
  • @Johannes Schaub - litb:我不知道他如此恶意。我浏览了他的其他线程,除了一个母语不是英语的人和一个还不真正了解 SO 来龙去脉的人之外,什么都没有注意到。你似乎比我更了解这里的邪恶......
  • 首先谢谢大家的回答其次我无法理解吉姆为什么你认为我试图取笑你?最后我如何标记问题已解决?

标签: c++ static constants


【解决方案1】:

其次:b::ok声明,但未定义。在某个地方,(最好是 b.cpp),您需要添加:

  int b::ok;

至于你的第一个问题,_IDconst,它的值不能改变——但是,你从来没有给它一个值。您必须为其分配一个初始值:

  protected:
      const int _ID = 1234;

现在,您确实应该也定义 _ID,就像我们对 b::ok 所做的那样,但由于它是 const,编译器可能会让您不这样做(某些条件适用)。

【讨论】:

    【解决方案2】:

    此代码有太多理由报告编译错误。

    • 在 C++ 中,声明类方法时不允许使用限定名称,因此类 a 定义中的 a::aa::top 完全是非法的。
    • 没有返回类型的方法声明应该意味着什么也不清楚。
    • b 中声明a::top 也没有任何意义。它在那里做什么?在类定义中间添加a::top(ok) 的目的是什么?

    换句话说,您的代码毫无意义。它甚至不是远程 C++ 代码。如果将其输入 C++ 编译器,结果将与将莎士比亚的“哈姆雷特”输入 C++ 编译器一样有意义。当每件事都出错时,无法说出代码有什么问题。如果这是其他语言,请相应地标记它而不是 [C++]。

    【讨论】:

      【解决方案3】:

      由于 _ID 是 const,它必须在构造函数/基成员初始化列表中进行初始化。有点像这样:

      a::a(int id) : _ID(5) {};
      

      但是,当我尝试构建它时,我遇到了很多错误。你确定你把整个东西都粘贴了?

      【讨论】:

        【解决方案4】:

        首先回答你的第二个问题:ok 是一个静态成员,需要这样初始化。包括类似于以下内容的行:

        int b::ok = 0;
        

        ...在你的类 b 的实现文件中。

        至于 _ID 成员:您将 _ID 声明为常量,但您没有定义它,即您没有为常量提供值。由于它是恒定的,并且您以后不允许更改它 - 那么您如何期望 _ID 取值?

        此外,您的源代码中还有一些其他“有趣”的事情让我建议您(重新)阅读介绍性文字。

        【讨论】:

          猜你喜欢
          • 2012-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-25
          相关资源
          最近更新 更多