2011-09-26 133 views
8

我目前工作的一个卡牌游戏的数组,我有一些初始化代码的麻烦:初始化对象

// 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值,并被视为指针。

+1

卡+我退卡+我;卡片++将卡片递增一个;卡片[i]返回卡片中第i个元素的引用。他们都是不同的。 – 2011-09-26 16:44:04

回答

15
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");) 
+0

我想一个矢量将是一个更好的主意。所以我尝试使用一个矢量,但现在我得到了一些我一直在运行的东西:一旦我包含,我从libcpmtd.lib中得到一个疯狂的“未解决的外部”错误列表。这告诉我,我的代码没有问题,但我仍然不会编译...呃。 –

+1

我希望使用std :: vector,现在要添加的元素数量,请勿使用push_back:开销很小,但可以避免。 你应该初始化正确大小的vector'std :: vector cards(20);'然后按照您为Array创建的方式初始化成员。 –

3

代码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循环从020,从而进入一个过去的数组的末尾。

0

如果您想避免不必要的构造函数调用不必要的调整大小,那么它会更复杂,因为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); 
}