我正在尝试学习c ++,并且在尝试确定继承时偶然发现了错误。
编译:daughter.cpp 在/home/jonas/kodning/testing/daughter.cpp:1中包含的文件中: /home/jonas/kodning/testing/daughter.h:6:错误:'{'令牌之前的预期类名 进程终止,状态为1(0分0秒) 1个错误,0个警告
我的档案: main.cpp中:
#include "mother.h"
#include "daughter.h"
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
mother mom;
mom.saywhat();
return 0;
}
mother.cpp:
#include "mother.h"
#include "daughter.h"
#include <iostream>
using namespace std;
mother::mother()
{
//ctor
}
void mother::saywhat() {
cout << "WHAAAAAAT" << endl;
}
mother.h:
#ifndef MOTHER_H
#define MOTHER_H
class mother
{
public:
mother();
void saywhat();
protected:
private:
};
#endif // MOTHER_H
daughter.h:
#ifndef DAUGHTER_H
#define DAUGHTER_H
class daughter: public mother
{
public:
daughter();
protected:
private:
};
#endif // DAUGHTER_H
和daughter.cpp:
#include "daughter.h"
#include "mother.h"
#include <iostream>
using namespace std;
daughter::daughter()
{
//ctor
}
我想做的是让女儿从母班继承公开的一切(= saywhat())。我做错了什么?
答案 0 :(得分:22)
您忘了在此处加入mother.h
:
#ifndef DAUGHTER_H
#define DAUGHTER_H
#include "mother.h" //<--- this line is added by me.
class daughter: public mother
{
public:
daughter();
protected:
private:
};
#endif // DAUGHTER_H
您需要包含此标头,因为daughter
来自mother
。因此编译器需要知道mother
的定义。
答案 1 :(得分:5)
首先,您已在实施文件中包含警戒。删除它们。
其次,如果从类继承,则需要包含定义类的标题。
答案 2 :(得分:5)
在daughter.cpp中,切换两行include。即。
#include "mother.h"
#include "daughter.h"
发生的事情是编译器正在研究类daughter
的定义,但找不到基类mother
的定义。所以它告诉你“我期待行中的{{”前面的标识符mother
class daughter: public mother {
是一个班级,但我找不到它的定义!“
在mother.cpp
中,删除包含daughter.h
。编译器不需要知道daughter.h
的定义;即,mother
课程可以在没有daughter
的情况下使用。添加daughter.h
的引入会在类定义之间引入不必要的依赖关系。
另一方面,在类(.cpp)的定义中保持包含头而不是类(.h)的声明总是更好的恕我直言。这样,当包含标题时,您不太可能需要解决标题包含的噩梦,而标题又包含您无法控制的其他标题。但是许多生产代码包括标题中的标题。两者都是正确的,当你这样做时需要小心。
答案 3 :(得分:2)
检查头文件中的#ifndef
和#define
是否唯一。
#ifndef BASE_CLIENT_HANDLER_H
#define BASE_CLIENT_HANDLER_H
#include "Threads/Thread.h"
class BaseClientHandler : public threads::Thread {
public:
bool isOn();
};
#endif //BASE_CLIENT_HANDLER_H
答案 4 :(得分:1)
与OP的问题无关,但是对于其他任何绊脚石的C ++学习者,我由于不同的原因而收到此错误。如果您的父类是模板化的,则需要在子类中指定类型名称:
#include "Parent.h"
template <typename ChildType>
class Child : public Parent<ChildType> { // <ChildType> is important here
};