1

好的,所以我有一个Character .h/.cpp,一个Enemy .h/.cpp,和一个Driver.cpp如果我在我的驱动程序中创建我的角色,我如何创建将操纵来自 Enemy 类的角色的方法?

前任。

Driver: Character* character = new Character();

现在,在我的敌人文件中,我希望敌人的行动能够改变character's值(生命、生命值等)。我知道我不能使用 character->setHP(whatever) 因为Enemy文件不知道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

我希望敌人的行动能够改变角色的价值(生命、生命值等)。我知道我不能使用 character->setHP(whatever) 因为 Enemy 文件不知道该角色存在......有没有办法做到这一点?

您可以通过在您的类中充当更改通知器的接口(实现为抽象类)来解耦您的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*/)
   }  

enemyChangeListener 类

该类enemyChangeListener只是一个抽象类,只有一个(也许更多)方法: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.
 }

您通过提供对您的对象的引用来实例化一个 Enemy 对象Character(敌人类在构造函数中将其视为一个enemyChangeListener对象。这种设计完成了两件事:

  1. 您的Enemy类不再需要担心类的实现细节(例如 getter 和 setter 方法)Character。它所知道的是,任何想要根据敌人对象上的某些事件来改变自己的对象都将实现所需的接口并自己处理更改。

  2. 您不仅可以将此接口与Character类一起使用,还可以与任何其他可能对侦听敌人对象的更改或操作感兴趣的类一起使用,并更改其自身的状态作为响应。

* PS:*

非静态成员引用必须相对于特定对象。

您是否检查过是否enemyAttack是静态函数?

于 2012-11-13T19:53:53.133 回答
0

您应该有一个公共文件,其中有一个角色和一个敌人。在该文件中,您应该处理诸如敌人伤害角色之类的事件,反之亦然。让 Enemy 实例直接更改角色实例中的值将需要两个类非常紧密地耦合,这将是不好的做法。

于 2012-11-13T18:05:41.513 回答
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 回答