初始化对象
我目前工作的一个卡牌游戏的数组,我有一些初始化代码的麻烦:初始化对象
// 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值,并被视为指针。
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");)
我想一个矢量将是一个更好的主意。所以我尝试使用一个矢量,但现在我得到了一些我一直在运行的东西:一旦我包含
我希望使用std :: vector,现在要添加的元素数量,请勿使用push_back:开销很小,但可以避免。 你应该初始化正确大小的vector'std :: vector
代码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
,从而进入一个过去的数组的末尾。
如果您想避免不必要的构造函数调用和不必要的调整大小,那么它会更复杂,因为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);
}
卡+我退卡+我;卡片++将卡片递增一个;卡片[i]返回卡片中第i个元素的引用。他们都是不同的。 – 2011-09-26 16:44:04