从另一个类更改值

时间:2012-11-13 18:02:15

标签: c++ class

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

实施例

Driver: Character* character = new Character();

现在,在我的敌人文件中,我希望敌人的动作能够改变character's值(生命,hp等)。我知道我不能使用character-> setHP(无论如何)因为Enemy文件不知道character存在...有没有办法做到这一点?

很抱歉,如果这令人困惑。

编辑:

好的,如果我将character传递给函数,我有

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

工作正常。

但回到我的Driver,如果我这样做:

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

我收到以下错误消息:“非静态成员引用必须与特定对象相关。” character不是特定对象吗?

3 个答案:

答案 0 :(得分:1)

  

我希望敌人的动作能够改变角色的值(生命,马力等)。我知道我不能使用character-> setHP(无论如何)因为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方法提供一个实现,根据敌人对象传递给{{的任何变化参数来改变角色对象。 1}}。

fireEnemyAttacked

通过提供对class Character : public enemyChangeListener{ //your methods and members; void fireEnemyAttacked(/*args*/){ //do the changes to the character. } 对象的引用来实例化Enemy对象(敌人类在构造函数中将其视为Character对象。此设计完成两件事:

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

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

  3. * PS:*

      

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

    您是否检查过Character是否为静态函数?

答案 1 :(得分:0)

编辑: 尝试将角色类放在敌人的上方或在敌人文件的顶部包含character.h。

创建能够通过传递参数来修改值的字符函数。

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

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

在函数....

character.ModLife(5);

答案 2 :(得分:0)

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