- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的问题是如何通过只有 1 个函数来对付所有敌人?
目前,我通过编写 Enemy
(类)并为其指定 object + number
名称来创建我的敌人,然后我只提供一些输入,它看起来像:
Enemy object1(1, 20, '/', "AQUA", 1);
Enemy object2(5, 40, '/', "YELLOW", 2);
Enemy object3(10, 60, '/', "WHITE", 3);
然后我有一个 Combat 运行时,我运行了一个糟糕的 while 循环:
while (object1.getHp() > 0)
运行我的战斗代码。
所以现在我只需要一个战斗功能来运行所有不同的敌人,我已经尝试了很多东西但似乎没有任何效果。知道我能做什么吗?
听起来和看起来很愚蠢,但我真的想不出有什么办法可以解决,已经浪费了大量时间寻找解决方案。
最佳答案
您首先需要的是 container能够容纳你的Enemy
实例或指向它们的指针。大多数容器都是模板化类,必须键入。其中之一是 vector (一个连续的“列表”),可以在您的情况下创建为
std::vector<Enemy>
: 包含所有对象的“列表”std::vector<Enemy*>
: 包含指向您的对象的指针的“列表”一个例子,如果你从你的对象中获取引用:
std::vector<Enemy*> enemies;
enemies.push_back(&object1);
enemies.push_back(&object2);
enemies.push_back(&object3);
对指针不熟悉的可以看here , 尽管一开始它可能有点不透明!
range for 循环可以让你很容易地遍历你的容器
for ( auto enemy : enemies ) {
enemy->doStuff();
}
auto
将从容器中推断出类型,并且 doStuff
将为您列表中的每个敌人顺序执行。如果您的容器包含实例而不是指针 *
,您需要引用 &
代替对象,并使用 for ( auto& enemy : enemies )
.这将确保您的对象已就地修改,而不是被复制,否则,您的更改将不会反射(reflect)在容器中。
正如其他答案中提到的,当您准备进入下一个级别时,您可以查看smart pointers。 .因为 C++ 代码是 unmanaged并且没有开箱即用的内存管理,你负责delete
任何new
编辑对象。智能指针将帮助您更安全地管理数据的生命周期。如今,在大多数情况下,原始指针(没有任何智能指针来保护它们)被认为是不好的做法。
但是,您的 Enemy
实例是在堆栈上创建的,因此它们将在其作用域结束时自动销毁(函数,{}
,...)。这也意味着如果你有任何指针 *
或者在这个范围之外使用它们的引用,你的对象已经被销毁,你会遇到内存异常或未定义的行为,即不要那样做!
关于c++ - 如何在 C++ 中循环遍历类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55114428/
我是一名优秀的程序员,十分优秀!