2016-05-05 7 views
2

私はこのヘッダファイルを持っており、タイプItemの変数を作成しようとしています。私は#include "Item.h"をインクルードしましたが、まだ私はコンパイル時に両方のプライベート変数でunknown type name Itemエラーが発生します。C++クラスヘッダーが含まれていると、「不明な型」が存在するのはなぜですか?

#ifndef PLAYER_H 
#define PLAYER_H 

#include <vector> 

#include "Item.h" 

using std::vector; 

class Player 
{ 

public: 

    // constructor 
    Player(void); 

    // destructor 
    virtual ~Player(void); 

private: 

    Item item; 
    std::vector <Item> inventory; 

}; 

#endif /* PLAYER_H */ 

これはどうなりますか?私は

#ifndef ITEM_H 
#define ITEM_H 

#include <string> 
#include "Player.h" 
#include "GlobalDefs.h" 

class Item { 
public: 
    Item(); 
    Item(gold_t v, std::string n); 

    virtual ~Item(); 

    // Getter 
    inline virtual gold_t GetValue (void) 
    { 
     return value; 
    } 

    // Getter 
    inline virtual std::string GetName (void); 

    // Getter 
    virtual std::string GetItemText(void); 

protected: 
    gold_t value; 
    std::string name; 

}; 

#endif /* ITEM_H */ 
+0

注:クラス本体の内部で定義されたメソッドは自動的にインラインになるため、 'GetValue'の' inline'キーワードは冗長です。また、0パラメータのパラメータリストを 'void 'としてマークすることも冗長です。 – emlai

答えて

1

を含むてる

相続人Item.hあなたcppファイルからItem.hを含める場合は、Player.hは、それから含まれています。次にPlayer.hにはItem.hが含まれていますが、インクルードガードのおかげでこれは事実上何も行いません。

次に、付属のPlayer.hでは、Itemはまだ宣言されていません。したがって、コンパイラはエラーを発行します。

Item.hには、Player.hの何も使用されていないため、#include "Player.h"Item.hから削除してください。

+0

'Item.h'が' #include "Player.h" 'を必要とした場合はどうなりますか? – j76goatboy

+0

循環依存を排除​​するようにデザインを変更します。 – MikeCAT

+0

私はそれをどうやって行うのかと尋ねるつもりでした。 'Item'が' Player'型をパラメータとして受け入れる必要がある場合、循環依存性を再導入せずにどうすればいいですか? – j76goatboy

1

"Player.h""Item.h"に含めて、circular dependencyにしてください。必ずしも必要なわけではないので、それを取り除くだけです。

関連する問題