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
的未定义引用答案 0 :(得分:5)
第二个:b::ok
已宣布,但未已定义。某处,(最好是b.cpp),你需要添加:
int b::ok;
至于你的第一个问题,_ID
是 const ,它的值无法更改 - 但是,你永远不会给它一个值来开始。您必须为其分配初始值:
protected:
const int _ID = 1234;
现在,您确实应该定义_ID,就像我们使用b :: ok一样,但由于它是const
,编译器可能会让您在不执行此操作的情况下逃脱(某些条件适用)。
答案 1 :(得分:4)
此代码也可能有理由报告编译错误。
a::a
定义中的a::top
和a
是完全非法的。 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取值呢?
此外,您的源代码中还有一些其他“有趣”的内容会让我建议您(重新)阅读介绍性文字。