2012-01-29 6 views
3

私は現在RPGゲームを作ろうとしており、何か問題があります。これはこれまで私が持っていたレイアウトです。私のプログラムにインクルードレイアウトを設定するにはどうすればよいですか?

クラス:

  • 俳優 - 何のための基本クラス
  • などのユニット、発射、とユニット「存在する」ということ - 継承俳優、すべてのユニットの基礎を。
  • ゲーム - ゲームには1つのインスタンスしかなく、ゲーム内のすべてのオブジェクトへのポインタが含まれます。私はそれを0.1秒ごとにすべてのアクターで仮想関数gameTickと呼ぶようにする予定です。

問題は、すべてのアクタにゲームインスタンスへのポインタを持たせたいということです。私が500の半径の領域のダメージを与える呪文を持っていたければ、Gameにその範囲内のすべてのユニットポインタを見つけて返してほしい。

私の問題は、私のプログラムがコンパイルされないActorのヘッダーファイルにGameを含める場合です。私の俳優にゲームを利用させるにはどうすればいいですか?それとも私はこれについて間違った方法をとっていますか?

ありがとうございます。

// START main.cpp 

#include <iostream> 
#include "game.h" 

int main() 
{ 
    std::cout << "All done\n"; 

    return 0; 
} 

// END main.cpp 



// START actor.h 

#ifndef __ACTOR_H_ 
#define __ACTOR_H_ 

#include <iostream> 

//#include "game.h" Causes many errors if uncommented 

class Actor 
{ 
public: 
    Actor(); 

    std::string name_; 
}; 

#endif 

// END actor.h 



// START actor.cpp 

#include "actor.h" 

Actor::Actor() 
{ 
    name_ = "Actor class"; 
} 
// END actor.cpp 



// START unit.h 

#ifndef __UNIT_H_ 
#define __UNIT_H_ 

#include "actor.h" 

class Unit : public Actor 
{ 
public: 
    Unit(); 
}; 

#endif 

// END unit.h 



// START unit.cpp 

#include "unit.h" 

Unit::Unit() 
{ 
    name_ = "Unit class"; 
} 

// END unit.cpp 



// START game.h 

#ifndef __GAME_H_ 
#define __GAME_H_ 

#include <vector> 

#include "unit.h" 

class Game 
{ 
public: 
    std::vector< Actor * > actors_; 
    std::vector< Unit * > units_; 
}; 

#endif 

// END game.h 
+0

依存関係の問題を修正するためにいくつかのことをインターフェイスに分割することについて考えてみましょう。私は、あなたが循環依存と関係していたエラーを仮定します。 –

+0

unit.hにはactor.h、actor.hにはgame.h、game.hにはunit.h / – Dan

答えて

2

の代わりにやって:

#include "actor.h" 
#include "unit.h" 

を、あなたは、単に前方2つのクラスを宣言することができます。

class Actor; 
class Unit; 

あなたはポインタのみを使用しているので、コンパイラはちょうどことを知っている必要がありますタイプはクラスなので、他に何も知る必要はありません。今すぐcppファイルで、#includeを実行する必要があります

1

あなたの目的のために十分な前方宣言があるかもしれません。あなたはクラスのオブジェクトをインスタンス化する必要がある場合はFWD宣言は十分ではありません唯一の状況は

  • です:コンパイラは、パブリックメソッドにアクセスする必要がある場合、そのオブジェクトは
  • を構築する必要がある方法を知っている必要があります/そのクラスの属性:コンパイラは、これらのメソッドの動作やアクセスしようとしている属性のタイプを知る必要があります。

上記のいずれも行っていない場合は、前方宣言で十分です。

関連する問題