【问题标题】: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 内有一个成员来保存他们各自的名字?

标签: c++ class constants instantiation


【解决方案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
  • 非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 2014-12-29
  • 2019-12-08
  • 2012-01-13
  • 1970-01-01
相关资源
最近更新 更多