更改另一个类的值

Changing a value from another class

本文关键字:另一个      更新时间:2023-10-16

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

Ex。

Driver: Character* character = new Character();

现在,在我的Enemy文件中,我希望敌人的行动能够更改character's值(生命值、hp等)。我知道我不能使用字符->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不是特定对象吗?

我希望敌人的行动能够改变角色的值(生命值、hp等)。我知道我不能使用角色->setHP(无论什么),因为敌人文件不知道角色存在。。。有办法做到这一点吗?

您可以通过接口(作为抽象类实现)解耦EnemyCharacter类,该接口用作Enemy类中的更改通知程序。考虑以下设计:

敌人等级

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.
}

通过提供对Character对象的引用来实例化Enemy对象(敌人类在构造函数中将其视为enemyChangeListener对象)

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

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

*PS:*

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

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

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

编辑:试着把角色类放在敌人的上方,或者把角色.h放在敌人文件的顶部。

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

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

在函数中。。。。

character.ModLife(5);
相关文章: