2016-11-13 4 views
2

プロジェクトを小さな部分に分割して、1000バイト以上の読み込みができなくなったため、定義された.hと.cppで定義された定義を使用する必要があります。他のファイル。プロジェクトを.hと.cppに分割する

プロジェクトは、以下のファイルが含まれています:上記

main.cppに RPG.hと.cppファイル Hero.hと.cppファイル Globaldefs.hと.cppの

#ifndef Hero_h 
#define Hero_h 
#include "Globaldefs.h" 
#include "RPG.h" 
#include <vector> 

using namespace std; 

extern class NPC; 
extern class Inventory; 

class Hero 
{ 
protected: 
    (...) 
    Inventory inventory; 
    (...) 
public: 
    vector<Mob*>::iterator TryAttack(vector <Mob*>& monsters, int & number); 
    vector<NPC*>::iterator TryTalk(vector <NPC*>& _NPCs, int & number); 

}; 
(...) 
#endif 

宣言はヒーローからです。 hファイルとコンパイラがラインインベントリインベントリのエラーを検出しました。 (そのクラスは外にあり、RPG.hで宣言され、RPG.cppで定義されています): 'Hero :: inventory'は未定義のクラス 'Inventory'を使用しますRPG d:\ programming \ rpg \ rpg \ rpg \ hero.h 23なぜMob(RPG.hと.cppの他のクラス)が適切に動作し、NPCもextern(RPG.hでも)として定義されているのか理解できません。未定義の型 '英雄' RPG dの使用:\プログラム\ \ RPG

#ifndef RPG_h 
#define RPG_h 
#include "Globaldefs.h" 
#include "Hero.h" 
#include <vector> 

using namespace std; 

class Mob; 
class NPC; 
class Fight; 
class Item; 
extern class Hero; 
(...) 
class Meat : public Item 
{ 
(...) 
public: 
    virtual void ActivateEffect(Hero* _hero) { _hero->AddHp(15); }; 
}; 
#endif 

これはRPG.hファイルであり、そしてそこには、compilatorは何かが

virtual void ActivateEffect(Hero* _hero) { _hero->AddHp(15); }; 

がある行に間違っていたと述べていますrpg \ rpg \ rpg.h 97の左と ' - > AddHp'はクラス/構造体/共用体/汎用型のRPGを指していなければなりませんRPG d:¥programming¥rpg¥rpg¥rpg¥rpg.h 97

私は多くをリサーチしました誰でも簡単にmain.cppにファイルを追加することに問題があり、内部接続をファイル間で行わない。

+0

main.cppに RPG.hと.cppファイル Hero.hと.cppファイル Globaldefs.hと.cppファイル:エディタfCKINとDは、私はコードとしてマークされ、それらなしに質問を投稿することができますいけません –

答えて

3

RPG.hを含むと、Hero.hに含めることができません。その逆もあります。

あなたがしたことは、HeroRPG.hに転送することです。これは良いことです。

しかし、その後、あなたはやった:

virtual void ActivateEffect(Hero* _hero) { _hero->AddHp(15); }; 

とコンパイラがAddHp方法にリンクするHeroクラスの構造を知る必要があります。あなたはそれをすることはできません。

代わりに(ちょうどメソッドを宣言する)ことを実行します。

virtual void ActivateEffect(Hero* _hero); 

そして#include "Hero.h"行を削除します。 RPG.cppファイルに続いて

は行います

#include "Hero.h" 
void RPG::ActivateEffect(Hero* _hero) { _hero->AddHp(15); } 

我々はInventory問題のコードが表示されていないが、私はそれは同じ問題だと仮定します。

  • は、ファイルB.hでファイルA.hを含めることができますが、その場合には、あなたはA.h
  • でファイルB.hを含めることはできませんが、A.hclass Bを宣言転送し、上のポインタ/参照を参照することができます。

    を要約しますそのクラスでは、ヘッダファイルにBのメソッドを使用しようとしない限りです。

  • だけA.cppB.hを含めるとA.cpp内のすべてのBメソッドへのアクセスを持って、AオブジェクトにBメソッドを使用します。彼らはあなたが、唯一の前方宣言RPG.hとHero.h、およびRPG.hライン97との間に循環依存を持つB
1

の方法/メンバーを使用する場合、一部のインラインメソッドは.hファイルで実装することができません(extern class Hero;)が表示されるので、Heroオブジェクト全体に対する参照と参照のみが可能であり、のメンバーHeroを参照することはできません。

循環依存性は、いずれの場合もそれ自体が不良設計を示す可能性があります。明らかにコードの一部ではない

関連する問題