我希望敌人的行动能够改变角色的价值(生命、生命值等)。我知道我不能使用 character->setHP(whatever) 因为 Enemy 文件不知道该角色存在......有没有办法做到这一点?
您可以通过在您的类中充当更改通知器的接口(实现为抽象类)来解耦您的Enemy
和类。考虑以下设计:Character
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.
}
您通过提供对您的对象的引用来实例化一个 Enemy 对象Character
(敌人类在构造函数中将其视为一个enemyChangeListener
对象。这种设计完成了两件事:
您的Enemy
类不再需要担心类的实现细节(例如 getter 和 setter 方法)Character
。它所知道的是,任何想要根据敌人对象上的某些事件来改变自己的对象都将实现所需的接口并自己处理更改。
您不仅可以将此接口与Character
类一起使用,还可以与任何其他可能对侦听敌人对象的更改或操作感兴趣的类一起使用,并更改其自身的状态作为响应。
* PS:*
非静态成员引用必须相对于特定对象。
您是否检查过是否enemyAttack
是静态函数?