1

ではCharacter .h/.cpp、 、Enemy .h/.cpp、および がありDriver.cppます。 ドライバーでキャラクターを作成している場合、Enemy クラスからキャラクターを操作するメソッドを作成するにはどうすればよいでしょうか?

元。

Driver: Character* character = new Character();

さて、私の敵ファイルでは、敵の行動によってcharacter's値 (ライフ、HP など) を変更できるようにしたいと考えています。Enemyファイルが存在することを認識していないため、 character->setHP(whatever) を使用できないことはわかっていcharacterます...これを行う方法はありますか?

これが紛らわしい場合は申し訳ありません。

編集:

characterわかりましたので、関数に渡すと、

ENEMY.CPP: void Enemy::enemyAttack(Character *character)
{ //whatever needs to be done }

これは正常に動作します。

しかし、Driver私がこれを行うと、私の中に戻ります:

Character *character = new Character();
Enemy::enemyAttack(character);

次のエラー メッセージが表示されます。character特定のオブジェクトではありませんか?

4

3 に答える 3

1

敵のアクションでキャラクターの値(ライフ、HPなど)を変更できるようにしたい。Enemy ファイルはキャラクターの存在を認識していないため、 character->setHP(whatever) を使用できないことはわかっています...これを行う方法はありますか?

クラスで変更通知機能として機能するインターフェース (抽象クラスとして実装) を介して、クラスEnemyとクラスを切り離すことができます。次の設計を検討してください。CharacterEnemy

敵のクラス

class Enemy{

   //your stuff
   enemyChangeListener ch;
   public:
      Enemy(/*your members*/,enemyChangeListener echl){
           /*your initialissation*/
           ch = echl;
      }

   //the method where you want to call a change on the character or any other object
   void enemyAttack(){
      //....//
      ch.fireEnemyAttacked(/*whatever args that describe the prop change in enemy object*/)
   }  

敵ChangeListener クラス

クラスは、次のようenemyChangeListenerに、1つ(場合によっては複数)のメソッドを持つ単なる抽象クラスです。fireEnemyAttacked

class enemyChangeListener{

      public:
       virtual void fireEnemyAttacked(/*args*/)=0;

}

文字クラス

これで、キャラクター クラス内で、enemyPropertyChanged 抽象クラスから継承しfireEnemyAttacked、敵オブジェクトの変更引数が に渡されたものに応じてキャラクター オブジェクトを変更するメソッドの実装を提供できますfireEnemyAttacked

class Character : public enemyChangeListener{

 //your methods and members;

 void fireEnemyAttacked(/*args*/){

   //do the changes to the character.
 }

オブジェクトへの参照を提供することにより、敵オブジェクトをインスタンス化しますCharacter(敵クラスはenemyChangeListenerコンストラクター内のオブジェクトとして認識します。この設計により、次の 2 つのことが達成されます。

  1. Enemyクラスは、クラスの実装の詳細 (getter メソッドや setter メソッドなど) について心配する必要がなくなりましたCharacter。それが知っているのは、敵オブジェクトの何らかのイベントに基づいて自分自身を変更したいオブジェクトは、必要なインターフェースを実装し、変更自体を処理するということだけです。

  2. このインターフェイスは、Characterクラスだけでなく、敵オブジェクトの変更やアクションをリッスンし、それに応じて自身の状態を変更することに関心のある他のクラスでも使用できます。

* PS: *

非静的メンバー参照は、特定のオブジェクトに関連している必要があります。

enemyAttackが静的関数かどうかを確認しましたか?

于 2012-11-13T19:53:53.133 に答える
0

編集: 文字クラスを敵の上に置くか、敵ファイルの先頭に character.h を含めてみてください。

パラメータを渡すことで値を変更できる関数を作成します。

void Character::ModLife(int M)
{
    hp -= M;
}

void Character::ModAr(int Ar)
{
    Armor -= Ar;
}

関数で....

character.ModLife(5);
于 2012-11-13T18:05:27.157 に答える
0

キャラクターと敵がいる共通ファイルが必要です。そのファイルでは、敵がキャラクターを傷つけたり、その逆のようなイベントを処理する必要があります。Enemy インスタンスでキャラクター インスタンスの値を直接変更すると、2 つのクラスを非常に緊密に結合する必要があり、悪い習慣になります。

于 2012-11-13T18:05:41.513 に答える