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

时间:2012-07-02 16:46:48

标签: c++ inheritance

我正在尝试学习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())。我做错了什么?

5 个答案:

答案 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

};