我真的很新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這cardException.h我得到的錯誤:cardException.h: error: expected class-name before ‘{’ token
和cardException.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 BaseCardException
和CardException.h: error: ‘Player’ does not name a type
發生。
如果同時使用前置聲明:cardException.h:8:7: error: multiple types in one declaration class BaseCardException
和cardException.h: error: invalid use of incomplete type ‘class BaseCardException’
我只是想知道我究竟做錯了什麼?
'class abstractPlayerBase.h;'是一個錯誤的和不必要的前向聲明。另外請注意,編譯器報告的錯誤實際上可能是包含文件中錯誤代碼的結果。 – orhtej2
player.h中的'class abstractPlayerBase.h'語法無效。這將導致任何包含player.h的頭文件都編譯失敗。而不是閱讀編譯器發出的最後一條錯誤消息,trhy回滾並閱讀FIRST。第一個錯誤信息更可能代表實際問題,而最後一個錯誤信息很可能會因編譯器被以前的問題困惑而出現亂碼。 – Peter
創建一個[mcve]。 – user2079303