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

とdaughter.cpp:

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

#include <iostream>

using namespace std;


daughter::daughter()
{
    //ctor
}

私がやりたいことは、娘が母クラス (=saywhat()) から public のすべてを継承できるようにすることです。私は何を間違っていますか?

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 の 2 行を切り替えます。すなわち

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

何が起こったのかというと、コンパイラが class の定義を調べていてdaughter、基本クラスの定義が見つからなかったということmotherです。motherつまり、「行の「{」の前に識別子が必要です」と言っています

class daughter: public mother {

クラスにする必要がありますが、その定義が見つかりません!"

ではmother.cpp、 の組み込みを削除しdaughter.hます。daughter.hコンパイラは;の定義を知る必要はありません。つまり、クラスmotherはなしで使用できdaughterます。の組み込みを追加するdaughter.hと、クラス定義間に不要な依存関係が導入されます。

一方、クラスの宣言(.h)ではなく、クラスの定義(.cpp)にヘッダーを含めることを常にお勧めします。このようにして、制御できない他のヘッダーを順番にインクルードするヘッダーをインクルードするときに、ヘッダー インクルージョンの悪夢を解決する必要が少なくなります。しかし、多くの製品コードにはヘッダーにヘッダーが含まれています。どちらも正しいですが、そうするときは注意が必要です。

于 2012-07-02T16:53:40.300 に答える
5

まず、実装ファイルにガードを含めました。それらを削除します。

次に、クラスから継承する場合は、クラスが定義されているヘッダーを含める必要があります。

于 2012-07-02T16:50:18.420 に答える