如何使用非常量值来实例化一个类的多个对象?

Posted

技术标签:

【中文标题】如何使用非常量值来实例化一个类的多个对象?【英文标题】:How could I use a non constant value to instantiate multiple objects of a class? 【发布时间】:2013-05-07 09:02:22 【问题描述】:

例如,我正在编写一个战斗模拟器,我想为每个回合实例化一个对象(每个 Turn 对象都有一个与当前回合号和回合所属的 Unit 对象相关的值)。

const int MAX_TURNS = 30;

for (int i = 1; i < MAX_TURNS; i++)

    Turn phase[i];

这就是引发问题的原因。当我实例化一个对象时,我不能使用 [i],因为它不是一个常量值。有人可以向我解释为什么这是/解决这个问题的任何方法吗?

这可能是一个愚蠢的问题,但我认为这样的事情会节省时间并且更容易通过对象进行引用?

谢谢!

【问题讨论】:

你想要每回合一个对象,还是当前回合中的i对象? Turn phase[i]; 将(如果 i 是一个常量表达式)创建 i 对象,而不仅仅是一个。 但这只是创建对象而没有做任何其他事情。一旦循环结束,所有对象都会调用析构函数吗?如果您想创建对象并让它们在循环之外存活,则应在堆上分配。 我想要的是一个预加载的空白回合列表,以便在生成战斗时,我可以使用两个单位的速度值来确定哪个回合属于谁。本质上,我只是希望它们具有以数字结尾的名称,例如: 阶段1、阶段2、阶段3等 @Iskardes 如果您希望他们有名字,为什么不在Turn 内有一个成员来保存他们各自的名字? 【参考方案1】:

您给出的代码尝试在每次迭代中创建i 对象。所以在第一次迭代中会有 1 个对象,在第二次迭代中会有 2 个对象。为此,您必须使用某种形式的动态数组。最好的方法是使用标准容器,例如std::vector

std::vector<Turn> phase(i);

但是,根据您的描述,听起来您只需要在每次迭代时创建一个新的 Turn 对象。这甚至不需要数组:

for (int i = 1; i < MAX_TURNS; i++)

    Turn phase;
    // Use phase

每次迭代都会从创建一个新的Turn 对象开始。

现在从您的 cmets 看来,您需要一个 MAX_TURNS Turns 数组:

Turn phases[MAX_TURNS];
for (int i = 0; i < MAX_TURNS; i++)

    // use phases[i];

请注意,我已经从 0 开始 i,因为数组是从 0 开始索引的。所以第一个 Turnphases[0],第二个是 phases[1],等等。

【讨论】:

@Koushik 当然。我假设他们会在循环中做其他事情。 很抱歉,我应该将其发布到 OP。抱歉移动评论。 那么从您发布的代码中,我可以在阶段名称中添加一个数字吗?每次循环重新迭代时,像第 1 阶段、第 2 阶段等? @Iskardes 看看我的最新编辑。我想这就是你想要的。您只需要一个大小为MAX_TURNSTurns 数组。那么phases[i] 是每次迭代的适当Turn 非常感谢!

以上是关于如何使用非常量值来实例化一个类的多个对象?的主要内容,如果未能解决你的问题,请参考以下文章

C++只能实例化1个对象的类

如何找出对象在哪里被实例化?

php--opp--5.如何实例化对象?

(JAVA)啥是实例化如何实现类的实例化(用类或方法创建一个该类的实例)?

PHP面向对象(OOP)编程入门教程5.如何实例化对象?

java中的实例化对象有啥用???????