如何批量创建Enemy类实例?数组与vector哪种方案更优?
批量创建Enemy实例:选vector还是数组?
嘿,这个问题问得太贴合实际开发场景了!对于批量管理Enemy这类动态对象的需求,std::vector绝对是比原生数组更优的选择,我给你掰扯下具体原因:
为什么vector更好?
- 动态扩容,灵活度拉满:原生数组的大小是编译期就固定死的,要是后期你想加更多敌人,得改代码重新编译;而vector会自动帮你管理内存容量,想加多少就用
push_back或emplace_back,完全不用操心“容量不够”的问题。 - 安全易用,减少bug:原生数组越界访问是未定义行为,排查起来头大;vector提供了
at()方法做边界检查,还有size()能随时知道当前有多少个敌人,遍历起来用范围for循环就能轻松搞定,代码可读性也高。 - 自动内存管理,避免泄漏:你现在用
new创建Enemy指针,最后还得手动delete,很容易漏删导致内存泄漏。如果用vector<std::unique_ptr<Enemy>>(存智能指针),vector销毁时会自动帮你清理所有内存;要是Enemy对象本身不大,甚至可以直接存vector<Enemy>,连指针都不用管,省心到爆。
改写后的代码示例
这里给你两种常见的实现方式,按需选择:
方式1:用智能指针存Enemy(适合Enemy对象较大或需要多态的场景)
#include <vector> #include <memory> // 引入智能指针头文件 void GameLoop(SDL_Window* Window, SDL_Renderer* Renderer) { // 用vector批量管理Enemy智能指针 std::vector<std::unique_ptr<Enemy>> enemies; // 批量创建敌人,还可以用循环批量生成 enemies.emplace_back(std::make_unique<Enemy>(Renderer, "S_Alien_1.bmp", 200, 100, 50, 35)); enemies.emplace_back(std::make_unique<Enemy>(Renderer, "S_Alien_1.bmp", 260, 100, 50, 35)); // 比如批量创建10个横向排列的敌人 // for (int i = 0; i < 10; ++i) { // int xPos = 200 + i * 60; // 每个敌人间隔60像素 // enemies.emplace_back(std::make_unique<Enemy>(Renderer, "S_Alien_1.bmp", xPos, 100, 50, 35)); // } // 统一调用所有敌人的Update方法 for (auto& enemy : enemies) { enemy->Update(); } // 统一调用所有敌人的Draw方法 for (auto& enemy : enemies) { enemy->Draw(); } }
方式2:直接存Enemy对象(适合Enemy对象较小、无需多态的场景)
#include <vector> void GameLoop(SDL_Window* Window, SDL_Renderer* Renderer) { std::vector<Enemy> enemies; // 直接构造Enemy对象存入vector enemies.emplace_back(Renderer, "S_Alien_1.bmp", 200, 100, 50, 35); enemies.emplace_back(Renderer, "S_Alien_1.bmp", 260, 100, 50, 35); // 遍历调用方法(直接用对象访问) for (auto& enemy : enemies) { enemy.Update(); enemy.Draw(); } }
总结
总之,在C++游戏开发里,这种需要动态管理对象集合的场景,vector是标准解决方案——它的灵活性、安全性和易用性都碾压原生数组,完全不用考虑数组的选项。
内容的提问来源于stack exchange,提问作者Samuel Walsh
相关产品推荐
相关产品推荐

