2012-07-02 10 views
12

私はC++を学ぼうとしており、継承を解明しようとしているときにエラーが発生しました。コンパイル非常に基本的な継承:エラー: '{'トークンの前に期待されるクラス名

:daughter.cpp をファイルでは/home/jonas/kodning/testing/daughter.cpp:1からインクルード: /home/jonas/kodning/testing/daughter.h:6:エラー:期待クラス - を 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:

ステータス1で終了 '{' トークン プロセス(0分0秒) 1エラー、0警告

マイファイルの前に名前を付けます

#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())。私は間違って何をしていますか?

+0

また、 'mother.h'または' mother.cpp'に 'daughter.h'を含める必要はありません。 あなたは相続財産をほぼ釘付けにし、提案された変更を行い、あなたは良いことをすべきです。 – nikhil

+0

C + +のコンベンションのヒントは、あなたが学んでいるように、クラス名の最初の文字は大文字で始まります。これは要件ではありませんが、一貫したコーディング規則であることがわかります。また、以下のいくつかの回答に肯定的なコメントを残していることがわかります - あなたを最も助けてくれた回答を受け入れてください!各回答の横にチェックマークが表示され、それをクリックすると受け入れられます。 StackOverflowに貢献してくれてありがとう! – WendiKidd

答えて

18

あなたはここに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 

daughtermotherから派生されているのであなたは、このヘッダーを含める必要があります。したがって、コンパイラはmotherの定義を知る必要があります。

5

最初に、実装ファイルにガードを含めました。削除してください。

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

+0

実際、ガードは '.h'ファイルのみにあります。最初の 'daughter.cpp'は実際に' daughter.h'であるはずです。 – Nawaz

+1

@Nawazええ、私はあなたが正しいと思います。私はちょうどcppを見て、警備員を含む: –

5

daughter.cppでは、includeの2行を切り替えます。何が起こっすなわち

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

コンパイラは、クラスdaughterの定義に見ていると、基本クラスmotherの定義を見つけることができなかったということでした。だから、{「私は目の前に識別子motherを期待している 『ことを伝えるの』ライン

class daughter: public mother { 

にクラスであるが、私はそれが定義だ見つけることができません!」

mother.cppには、daughter.hを含めないでください。コンパイラはdaughter.hの定義を知る必要はありません。すなわちクラスmotherdaughterなしで使用することができる。 daughter.hを含めると、クラス定義間に不要な依存関係が導入されます。

一方、クラス(.cpp)の定義にヘッダーを含めるのは常に良いですが、クラス(.h)の宣言ではありません。この方法では、ヘッダーを含むときに、ヘッダー組み込みの悪夢を解決する必要性は低くなります。ヘッダーには、制御できないヘッダーも含めます。しかし、多くのプロダクションコードはヘッダーにヘッダーを含んでいます。どちらも正しいですが、それをするときには注意する必要があります。

+0

それを得た。本当にありがとうございました。あなたはすべて素晴らしいです! – Jonas

関連する問題