2017-10-07 128 views
0

我真的很新C++,我正在嘗試完成一個小項目來理解繼承。我在包含和轉發聲明方面遇到問題。以下是這似乎是在發出以下標題:使用循環包含和前向聲明類

#ifndef CARDEXCEPTION_H 
#define CARDEXCEPTION_H 
#include "baseCardException.h" 

class Player; //the problem seems to be here 
class CardException: public BaseCardException 
{ 
public: 
    CardException(const Player& p); 
}; 
#endif 

player.h:

#ifndef PLAYER_H 
#define PLAYER_H 
#include "abstractPlayerBase.h" 
#include "cardException.h" 
class abstractPlayerBase; 
class Player: public AbstractPlayerBase 
{ 
    ... 
    //a function throws a CardException 
}; 
#endif 

baseCardException.h:

#ifndef BASECARDEXCEPTION_H 
#define BASECARDEXCEPTION_H 
#include "Player.h" 

class BaseCardException 
{ 
... 
}; 
#endif 

cardException.h這car​​dException.h我得到的錯誤:cardException.h: error: expected class-name before ‘{’ tokencardException.h: error: multiple types in one declaration

,如果我用這個cardException:

#ifndef CARDEXCEPTION_H 
#define CARDEXCEPTION_H 
#include "baseCardException.h" 

class BaseCardException; //this changed 
class CardException: public BaseCardException 
... 

錯誤:cardException.h: error: invalid use of incomplete type ‘class BaseCardException’ class CardException: public BaseCardExceptionCardException.h: error: ‘Player’ does not name a type發生。

如果同時使用前置聲明:cardException.h:8:7: error: multiple types in one declaration class BaseCardExceptioncardException.h: error: invalid use of incomplete type ‘class BaseCardException’

我只是想知道我究竟做錯了什麼?

+1

'class abstractPlayerBase.h;'是一個錯誤的和不必要的前向聲明。另外請注意,編譯器報告的錯誤實際上可能是包含文件中錯誤代碼的結果。 – orhtej2

+0

player.h中的'class abstractPlayerBase.h'語法無效。這將導致任何包含player.h的頭文件都編譯失敗。而不是閱讀編譯器發出的最後一條錯誤消息,trhy回滾並閱讀FIRST。第一個錯誤信息更可能代表實際問題,而最後一個錯誤信息很可能會因編譯器被以前的問題困惑而出現亂碼。 – Peter

+0

創建一個[mcve]。 – user2079303

回答

1

BaseCardException.h似乎包含一個名爲CardException的類的聲明,但是您的命名約定會顯示它應該包含一個名爲BaseCardException的類。

由於編譯器無法在CardException類嘗試從其繼承的位置找到BaseCardException類的定義,因此您會收到錯誤消息。

此外,AbstractPlayerBase類的定義在哪裏?