c++ - 如何在 C++ 中循环遍历类对象

标签 c++

我的问题是如何通过只有 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/

相关文章:

c++ - 如何在用户只需按 C++ 中的输入时获取输出

c++ - 如何将 opencv_contrib 添加到 CMake 项目?

c++ - 什么是 libstdc++-libc 以及何时需要它

java - C++和Java编译过程的区别

c++ - 使派生类遵循特征

c++ - 是否可以阻止引用的向上转换?

c++ - 句柄和智能指针一样吗?

c++ - 为什么GCC的ifstream >> double分配了这么多的内存?

c++ - 在 C/C++ 预处理器中单独一行的单个井号/井号 (#) 的目的是什么?

c++ - Qt QFile 和 OpenGL ES 2.0 顶点着色器意外的文件结尾