27

我正在尝试学习 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;
}

母亲.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

和女儿.cpp:

#include "daughter.h"
#include "mother.h"

#include <iostream>

using namespace std;


daughter::daughter()
{
    //ctor
}

我想做的是让女儿从母类(=saywhat())继承所有公共的东西。我究竟做错了什么?

4

5 回答 5

32

你忘了在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.

于 2012-07-02T16:49:51.037 回答
10

在daughter.cpp中,切换include的两行。IE

#include "mother.h"
#include "daughter.h"

发生的事情是编译器正在查看类daughter的定义,但找不到基类的定义mother。所以它告诉你“我期待该mother行中“{”前面的标识符

class daughter: public mother {

成为一个类,但我找不到它的定义!”

mother.cpp中,删除 的包含daughter.h。编译器不需要知道 ; 的定义daughter.h。ie 类mother可以不用daughter. 添加包含daughter.h在类定义之间引入了不必要的依赖关系。

另一方面,恕我直言,在类的定义(.cpp)而不是类的声明(.h)中保留包含标题总是更好。这样,当包含标题时,您不太可能需要解决标题包含噩梦,而这些标题又包含您无法控制的其他标题。但是许多生产代码在标头中包含标头。两者都是正确的,只是在这样做时需要小心。

于 2012-07-02T16:53:40.300 回答
9

与 OP 的问题无关,但对于任何其他偶然发现此问题的 C++ 学习者来说,我因为不同的原因而收到此错误。如果你的父类是模板化的,你需要在子类中指定类型名称:

#include "Parent.h"

template <typename ChildType>
class Child : public Parent<ChildType> { // <ChildType> is important here

};
于 2019-10-03T03:30:24.030 回答
6

检查#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
于 2019-01-28T14:47:21.003 回答
5

首先,您在实现文件中包含警卫。删除它们。

其次,如果您从一个类继承,则需要包含定义该类的标头。

于 2012-07-02T16:50:18.420 回答