如何使用非常量值来实例化一个类的多个对象?
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
Turn
s 数组:
Turn phases[MAX_TURNS];
for (int i = 0; i < MAX_TURNS; i++)
// use phases[i];
请注意,我已经从 0
开始 i
,因为数组是从 0 开始索引的。所以第一个 Turn
是 phases[0]
,第二个是 phases[1]
,等等。
【讨论】:
@Koushik 当然。我假设他们会在循环中做其他事情。 很抱歉,我应该将其发布到 OP。抱歉移动评论。 那么从您发布的代码中,我可以在阶段名称中添加一个数字吗?每次循环重新迭代时,像第 1 阶段、第 2 阶段等? @Iskardes 看看我的最新编辑。我想这就是你想要的。您只需要一个大小为MAX_TURNS
的Turn
s 数组。那么phases[i]
是每次迭代的适当Turn
。
非常感谢!以上是关于如何使用非常量值来实例化一个类的多个对象?的主要内容,如果未能解决你的问题,请参考以下文章