我有一个名为A的类,带有以下定义:
class A {
public:
int time;
A *next;
someFunc();
A();
virtual ~A();
};
我有一个称为B的子类,具有以下定义:
#include "A.h"
class B : public A {
public:
int state;
Foo *ID;
someFunc();
B(int time, A *next, int state, Foo *id);
virtual ~B();
};
b的构造函数定义为:
B::B(int time, A *next, int state, Foo *id) : time(time), next(next), state(state), ID(id) { }
当我构建程序时,我会遇到一个错误,即B类没有名为" Time"或" Next"的字段。我确保B.H文件和B.CPP文件中包含A.H,但似乎没有区别。值得注意的是,B类中的某些func((已被识别。我定义了一个与B.CPP中A类版本不同的身体。在B.H的声明中,Eclipse有一个标记,提醒我它"阴影" A :: somefunc((,所以我知道B至少继承了。
我正在以日食为基础,并使用makefile来构建它。我的B.O建筑物的线路是:
B.o: B.cpp B.h
g++ -c -Wall -g B.cpp
我还尝试在第一行末尾添加A.H,这无济于事。我是否缺少可能导致此错误的东西?
您不能初始化基类的成员,应该是基类的责任。
您可以添加一个为A
启动此类成员的构造函数:
class A {
public:
int time;
A *next;
someFunc();
A();
virtual ~A();
A(int time, A* next);
};
A::A(int time, A *next) : time(time), next(next) { }
然后
B::B(int time, A *next, int state, Foo *id) : A(time, next), state(state), ID(id) { }
或在B
的构造函数中分配它们,如果您无法添加A
的构造函数:
B::B(int time, A *next, int state, Foo *id) : state(state), ID(id) {
this->time = time;
this->next = next;
}
您为参数使用了相同的名称,因此它们"隐藏"成员。您可以在构造体的主体中做类似的事情:
this->time = time;
this->next = next;
构造函数初始化列表只能初始化其自己的类成员,而不是其父会员的成员。您通常想做的是使用父构建函数来初始化这些初始化。
class A {
public:
int time;
A *next;
someFunc();
A(int time, A *next) : time(time), next(next) {}
virtual ~A();
};
class B : public A {
public:
int state;
Foo *ID;
someFunc();
B(int time, A *next, int state, Foo *id) : A(time, next), state(state), ID(ID) {}
virtual ~B();
};
类B
确实有来自A
的成员。但是它们不在构造函数初始化列表的范围内。您必须创建一个A
构造函数,以将要传递给A
的参数:
class A {
public:
int time;
A *next;
someFunc();
A(int time, A* next)
: time(time), next(next)
{}
virtual ~A();
};
class B : public A {
public:
int state;
Foo *ID;
someFunc();
B(int time, A *next, int state, Foo *id)
: A(time, next), ID(id)
{}
virtual ~B();
};