我目前正在制作纸牌游戏,但我遇到了一些初始化代码问题:
// 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+i
,cards++
和cards[i]
只有3种说法相同的方法吗?我认为每个都是l值,并被视为指针。
答案 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"), /* ... */ };
巨大的缺点是在这种情况下您不能使用循环。