C ++:有很多对象

时间:2013-04-23 20:03:10

标签: c++ class object

所以,我有一个关于C ++的问题。让我们说我有一个游戏的敌人类。我希望能够(在理论上)在我的游戏中拥有无数的敌人。所以我必须有每个类的多个实例,我需要能够分别访问它们。我是否必须拥有一组具有无限量空间的敌人对象,我会使用new和delete运算符来创建和删除阵列中的敌人?然后我需要一个变量来保持敌人的数量,对吗?

7 个答案:

答案 0 :(得分:5)

使用std::vector。它会根据需要自动分配更多内存。

标准库中还有其他容器会在需要时自动分配内存,例如std::liststd::setstd::map。这些容器在特殊情况下可能更合适,但std::vector通常是最佳选择。这一切都取决于实施细节。

你可以像这样使用它:

#include <vector>

struct Enemy {
    //...
}

std::vector<Enemy> v;

Enemy e1, e2;
v.push_back(e1);
v.push_back(e2);

std::cout << "First enemy in vector: " << v[0];

答案 1 :(得分:2)

回答了什么样的数据结构:

的std ::矢量

这还没有从游戏编程的角度来回答,所以在这里。

如果您正在使用像Vector这样的数据结构而不考虑您要存储的对象数量,那么您将遇到问题。

大多数游戏循环都会更新数组中的每个“角色”对象。如果你担心“无限”角色,你可能不想更新游戏更新功能中的每个角色。

如果你只有一些角色或一个可管理的数量,那么Vector就可以了。

然而,如果你要拥有一个拥有数百或数千个角色的世界。 Vector不再是您想要使用的数据结构。

在这种情况下,您将更适合使用称为四叉树(2d)或八叉树(3d)的东西。对这些数据结构的解释超出了本答案的范围。只要知道它们将更有效地用于游戏目的。

答案 2 :(得分:1)

您可能希望使用标准库中的容器。标准库中最好的起点可能是vector。它就像一个数组,但会根据您添加到其中的项目数进行扩展。这样你就不会浪费任何空间。

根据您的具体要求,还有其他具有不同性能特征的容器。但是矢量通常是一个非常好的起点。 This是选择标准容器的非常好的参考。

答案 3 :(得分:1)

在C ++中,std::vector<>是动态可调整大小的数组的数据结构。我会从敌人的矢量开始。

class Enemy { ... };

std::vector< Enemy > enemyCollection;

vector数据结构将为您处理内存管理。请参阅http://www.cplusplus.com/reference/vector/vector/以供参考。

答案 4 :(得分:1)

这就是为什么我们在C ++中有容器的原因:vector,list,deque和更多专门的容器(例如map,一个关联容器)。

他们可以根据需要增长和缩小,您可以轻松添加和删除项目。您使用哪一个取决于您的确切需求(查找复杂性,随机访问,插入复杂性......)。

正如其他人所提到的,如果你不熟悉标准容器,矢量可能是一个很好的起点,随着时间的推移,你将学会为正确的工作选择合适的容器。

答案 5 :(得分:1)

  

我是否必须拥有一组具有无限数量空间的敌人物体

我会说这很可能是一个糟糕的想法。根据这些“敌人”的设计和性质,你可能不需要在所有时间内将所有这些数据都存储在内存中...当你的内存不足时你的游戏会发生什么?

每个敌人对象真的需要是完整的对象吗?看一下flyweight设计模式。我猜你不需要立刻拥有所有这些。

敌人类实例对应于单个敌人的概念可能是你指向错误的地方。

其他潜在的模式包括代理和原型。

  

我会使用new和delete运算符来创建和删除数组中的敌人吗?

取决于您的实施。如果你malloc / new你必须释放/删除。这是微不足道的,与您放置对象的容器无关,而是取决于创建过程。

请记住,如果你在游戏中并且不得不经常调用malloc / new来创建你的敌人,你的游戏性能会很糟糕。每次你将进入系统调用操作系统,一次只能授予一个线程,如果一堆发生在不同的线程上你会得到很多滞后,这对你来说可能或不重要;给出上下文我现在假设这个对你很重要,但为了别人的缘故我还是提到了它。我建议弄清楚你需要多少你需要的东西,并获得所需的所有内存,如果你用完了,请求两倍......但这是一个关于内存管理的完全独立的话题......这与您的数据结构和构建范例没什么关系。

  

然后我需要一个变量来保持敌人的数量,对吧?

取决于您如何存储它们。如果您使用的是c-array,那么您自己管理是的。大多数正式容器都有相当有效的方法来获得它们的大小但两者之间可能存在警告。

然而,鉴于您提出这个问题,我认为您应该立即退出当前的实施细节和代码行,并查看您正在组合的更高级别的架构,这些架构似乎没有想到或理解。 “从头脑开始”

任何人都不可能以有价值的方式明确回答当前形式的问题。看起来你真正的问题是:

  1. 什么是容器,它们是如何工作的?
  2. 管理这些大型敌人的有效范例是什么(从Gang of Four的设计模式中认真查看FlyWeight)
  3. 我应该如何构建我的数据结构?
  4. 关于1:关于本网站的数据结构有大量的问题/答案,以及大量有关无数现有数据结构的书籍和文档。 STL提供了数十种,Boost也是如此。我不打算在这里重复一下。

    关于2.正如我所说,你需要看一下众所周知的模式来解决这个问题。我在上面提出了一些建议。如果没有更多的信息,这是我能提供的最普遍有用的信息,可能对其他人有用。

    关于3.我认为你应该考虑一个Factory方法或抽象工厂或类似的东西,如果你坚持使用离散的项目,这样你就不必在处理内存分配失败时丢弃你的代码而不能再实例化敌人。

答案 6 :(得分:0)

只需使用std :: vector;它是一个动态数组,无限绑定。