非常基本的继承:错误:“”标记之前的预期类名
Posted
技术标签:
【中文标题】非常基本的继承:错误:“”标记之前的预期类名【英文标题】:Very basic inheritance: error: expected class-name before ‘’ token非常基本的继承:错误:“”标记之前的预期类名 【发布时间】:2012-07-02 16:46:47 【问题描述】:我正在尝试学习 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;
母亲.h:
#ifndef MOTHER_H
#define MOTHER_H
class mother
public:
mother();
void saywhat();
protected:
private:
;
#endif // MOTHER_H
女儿.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())继承所有公共的东西。我做错了什么?
【问题讨论】:
另外,您不需要在mother.h
或mother.cpp
中包含daughter.h
。您几乎已经确定了继承,进行了建议的更改,您应该一切顺利。
C++ 约定提示,正如您所说,您只是在学习——类名的第一个字母通常大写。这不是必需的,但您会发现它是一致的编码约定。另外,我看到你在下面的一些答案上留下了积极的 cmets——请接受对你帮助最大的答案!每个答案旁边应该有一个复选标记,单击它将接受它。感谢您为 *** 做出贡献!
【参考方案1】:
您忘记在此处添加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
的定义。
【讨论】:
【参考方案2】:在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】:与 OP 的问题无关,但对于任何其他偶然发现此问题的 C++ 学习者来说,我收到此错误的原因不同。如果你的父类是模板化的,则需要在子类中指定类型名称:
#include "Parent.h"
template <typename ChildType>
class Child : public Parent<ChildType> // <ChildType> is important here
;
【讨论】:
【参考方案4】:检查您的头文件中的#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
【讨论】:
这有帮助。谢谢!【参考方案5】:首先,你在实现文件中包含了守卫。删除它们。
其次,如果你从一个类继承,你需要包含定义类的头文件。
【讨论】:
实际上守卫只在.h
文件中。我想,她有一个错字:第一个 daughter.cpp
实际上应该是 daughter.h
。
@Nawaz 是的,我认为你是对的。我刚刚看到 cpp 并包含警卫 :)以上是关于非常基本的继承:错误:“”标记之前的预期类名的主要内容,如果未能解决你的问题,请参考以下文章