C++ 静态成员和常量

C++ 静态成员和常量,c++,static,constants,C++,Static,Constants,首先,为什么只有在删除const时才解决这个编译错误 非静态常量成员“const int Student::_ID”,不能使用默认赋值运算符- 从“void std::vector::_M_insert_aux(uuu gnu_cxx::uuu normal_迭代器,const _Tp&)[带Tp=Student,u Alloc=std::allocator]”实例化 第二 我还有另一个问题 对b::ok的未定义引用已声明,但未定义。某处(最好是b.cpp),您需要添加: class a { p

首先,为什么只有在删除const时才解决这个编译错误

非静态常量成员“const int Student::_ID”,不能使用默认赋值运算符- 从“void std::vector::_M_insert_aux(uuu gnu_cxx::uuu normal_迭代器,const _Tp&)[带Tp=Student,u Alloc=std::allocator]”实例化

第二

我还有另一个问题


对b::ok的未定义引用已声明,但未定义。某处(最好是b.cpp),您需要添加:

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);
}
至于您的第一个问题,
\u ID
是常量,它的值不能更改——但是,您从来没有给它一个值作为开始。必须为其指定一个初始值:

  int b::ok;

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

此代码也可能有报告编译错误的原因

  • C++中,在声明类方法时不允许使用限定名称,因此您的<代码> A:A/<代码>和<>代码> A::在类<代码> > < < /> >的定义中,“顶部< />代码”是非法的。李>
  • 没有返回类型的方法声明的含义也不清楚
  • b
    中声明
    A::top
    也没有意义。它在那里干什么?“<代码> >:在类定义中间的顶部(OK)< /代码>的意图是什么?

换句话说,你的代码毫无意义。它甚至不是一个远程C++代码。如果你把它放入C++编译器中,结果就和你把莎士比亚的“哈姆雷特”输入到C++编译器中一样有意义。当一切都出错时,不可能说出代码有什么问题。如果这是其他语言,请相应地标记它,而不是[C++]

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

  protected:
      const int _ID = 1234;

然而,当我尝试构建这个时,我遇到了大量错误。您确定粘贴了整个内容吗?

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

a::a(int id) : _ID(5) {};
…在类b的实现文件中

至于_ID成员:您声明_ID是一个常量,但您没有定义它,即您没有为该常量提供值。因为它是常量,以后不允许更改它-那么您希望_ID如何取值


此外,您的源代码中还有一些“有趣”的地方,我建议您(重新)阅读一篇介绍性文章。

请保持庄重,以可读性好的方式格式化您的源代码。这也适用于问题文本本身。@Jim Brissom:放松一下Mati-看起来他/她是新用户。更好的是,帮他/她格式化,这样他/她就可以看到它@马蒂:这里是格式参考:[@Otaku不,他只是不在乎一个真实的答案,或者他只是取笑这么多用户,或者两者兼而有之。看看他的其他问题。我不会浪费时间教一个巨魔如何按“格式”巴顿。@Johannes Schaub-litb:我不知道他这么恶毒。我浏览了他的其他帖子,除了一个母语不是英语的人和一个还不太了解事情的来龙去脉的人之外,我什么也没注意到。你似乎比我更了解一个更深层次的邪恶……首先感谢大家的回答第二,我无法理解吉姆,你为什么认为我会取笑你?最后,我是如何指出问题已经解决的?
int b::ok = 0;