2012-07-02 41 views
12

我試圖學習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())。我究竟做錯了什麼?

+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。即

#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)。通過這種方式,當包含頭文件時,您不太可能需要解決頭文件包含噩夢的問題,頭文件包含其他頭文件,而這些頭文件無法控制。但許多生產代碼在標題中包含標題。兩者都是正確的,只需要小心,當你這樣做。

+0

明白了。非常感謝你。你們都很棒! – Jonas

相關問題