初始化对象数组

时间:2011-09-26 16:22:29

标签: c++ arrays

我目前正在制作纸牌游戏,但我遇到了一些初始化代码问题:

// in my class...
Card cards[20];
// in method...
for(int i = 0; i <= 20;i++)
    cards++ = new Card(i, /*i as char +*/ "_Card.bmp");

问题是我的编译器告诉我cards++不是l值。我已经阅读了整个指针 - 数组等价的东西,我以为我理解它,但唉,我无法让它工作。我的理解是,由于cards降级为指针,new运算符给我一个指向我新卡实例位置的指针,因此上面的代码应该编译。正确?

我也试过使用下标,但不是cards+icards++cards[i]只有3种说法相同的方法吗?我认为每个都是l值,并被视为指针。

5 个答案:

答案 0 :(得分:17)

Card cards[20];

cards已经是一个对象数组。它们是使用默认构造函数构造的(没有参数的构造函数)。无需再次new。可能你需要一个与构造函数参数等效的成员函数,并通过它进行赋值。

for ( int i=0; i<20; ++i ) // array index shouldn't include 20
   cards[i].memberFunction(/*....*/);

更简单的是使用std::vector

std::vector<Card> cards;
for( int i=0; i<20; ++i )
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp"); )

答案 1 :(得分:4)

代码Card cards[20];已经创建了一个包含20个Card对象的数组,并使用默认构造函数创建它们。根据您的代码,这可能不是您想要的。

我建议改用vector

std::vector<Card> cards;

for(int i = 0; i < 20;i++)
{
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp"));
}

请注意,您的for循环从0转到20,因此超出了数组末尾。

答案 2 :(得分:1)

如果你想避免不必要的构造函数调用不必要的大小调整,那么它会更复杂,因为C ++通常会在分配时逐个初始化每个对象。一种解决方法是使用Java方式 - 使用循环和指针数组,如下所示:

Card *cards[20];
for (int i=0; i<20; i++) {
  cards[i] = new Card(i);
}

另一种选择是使用malloc来获得明确未初始化的内存:

Card *cards = malloc(20 * sizeof(Card));
for (int i=0; i<20; i++) {
  new (&(cards[i])) Card(i);
}

答案 3 :(得分:1)

代码中的数组名variant包含数组第一个元素的地址。此类地址在运行时分配,您无法更改它们。因此编译器抱怨cards不是l值。

但你可以使用如下指针明确指定这些地址可以容纳的内容:

cards

答案 4 :(得分:0)

还有另一种可能性,当您可以在初始化时自动调用构造函数时:

// in my class...
Card cards[20] = { Card(0, "0_Card.bmp"), Card(1, "1_Card.bmp"), /* ... */ };

巨大的缺点是在这种情况下您不能使用循环。