静态成员和consts

时间:2010-09-13 20:18:21

标签: c++ static const

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成员'const int Student :: _ ID',不能使用默认赋值运算符 -  实例化自'void std :: vector :: _ M_insert_aux(__ gnu_cxx :: __ normal_iterator,const _Tp&)[with _Tp = Student,_Alloc = std :: allocator]'

第二

我有另一个问题

对b :: ok

的未定义引用

4 个答案:

答案 0 :(得分:5)

第二个:b::ok宣布,但未已定义。某处,(最好是b.cpp),你需要添加:

  int b::ok;

至于你的第一个问题,_ID const ,它的值无法更改 - 但是,你永远不会给它一个值来开始。您必须为其分配初始值:

  protected:
      const int _ID = 1234;

现在,您确实应该定义_ID,就像我们使用b :: ok一样,但由于它是const,编译器可能会让您在不执行此操作的情况下逃脱(某些条件适用)。

答案 1 :(得分:4)

此代码也可能有理由报告编译错误。

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

换句话说,你的代码没有任何意义。它甚至不是远程C ++代码。如果将它提供给C ++编译器,结果就像将莎士比亚的“哈姆雷特”输入C ++编译器一样有意义。 所有错误时,无法说出代码有什么问题。如果这是其他语言,请相应地标记它而不是[C ++]。

答案 2 :(得分:2)

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

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

然而,当我尝试构建它时,我遇到了很多错误。你确定你粘贴了整个东西吗?

答案 3 :(得分:0)

首先回答你的第二个问题:ok是静态成员,需要初始化。包括类似于:

的行
int b::ok = 0;

...在班级b的实施文件中。

至于_ID成员:您将_ID声明为常量,但未定义它,即您没有为常量提供值。由于它是常量而你以后不允许改变它 - 你怎么期望_ID取值呢?

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