非常基本的继承:错误:“”标记之前的预期类名

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.hmother.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 并包含警卫 :)

以上是关于非常基本的继承:错误:“”标记之前的预期类名的主要内容,如果未能解决你的问题,请参考以下文章

C++ 在 标记之前期望类名,继承错误

'令牌类继承之前的c ++预期类名[重复]

“”之前的预期类名

“&”标记之前的预期声明说明符或“...”

令牌SDL错误之前的预期类名[关闭]

src/walletdb.h:96:1:错误:“”令牌之前的预期类名