更改另一个类的值
Changing a value from another class
好的,所以我有一个Character .h/.cpp
、Enemy .h/.cpp
和Driver.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(无论什么),因为敌人文件不知道角色存在。。。有办法做到这一点吗?
您可以通过接口(作为抽象类实现)解耦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.
}
通过提供对Character
对象的引用来实例化Enemy对象(敌人类在构造函数中将其视为enemyChangeListener
对象)
Enemy
类不再需要担心Character
类的实现细节(如getter和setter方法)。它所知道的是,任何想要根据敌方对象上的某个事件来改变自己的对象都将实现所需的接口并自己处理更改。您不仅可以将此接口与
Character
类一起使用,还可以将任何其他可能感兴趣的类用于侦听对敌方对象的更改或操作,并更改其自身的状态作为响应。
*PS:*
非静态成员引用必须相对于特定对象。
您检查过enemyAttack
是否是静态函数吗?
您应该有一个公共文件,其中包含一个角色和一个敌人。在该文件中,你应该处理诸如敌人伤害角色之类的事件,反之亦然。让Enemy实例直接更改角色实例中的值需要两个类紧密耦合,这是不好的做法。
编辑:试着把角色类放在敌人的上方,或者把角色.h放在敌人文件的顶部。
在字符中创建能够通过传递参数来修改值的函数。
void Character::ModLife(int M)
{
hp -= M;
}
void Character::ModAr(int Ar)
{
Armor -= Ar;
}
在函数中。。。。
character.ModLife(5);
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口