我目前正在开发纸牌游戏,我遇到了一些初始化代码问题:
// in my class...
Card cards[20];
// in method...
for(int i = 0; i <= 20;i++)
cards++ = new Card(i, /*i as char +*/ "_Card.bmp");
Run Code Online (Sandbox Code Playgroud)
问题是我的编译器告诉我这cards++不是一个l值.我已经阅读了整个指针 - 数组等价的东西,我以为我理解它,但唉,我无法让它工作.我的理解是,由于cards降级为指针,并且new操作员给我一个指向我的新Card实例的位置的指针,所以上面的代码应该编译.对?
我已经使用标尝试为好,但不cards+i,cards++和cards[i]刚3说同样的事情的方法呢?我认为每个都是l值,并被视为指针.
Mah*_*esh 17
Card cards[20];
Run Code Online (Sandbox Code Playgroud)
cards已经是一个对象数组.它们是使用默认构造函数构造的(没有参数的构造函数).没有必要new再来一次.可能你需要一个等同于构造函数参数的成员函数并通过它进行赋值.
for ( int i=0; i<20; ++i ) // array index shouldn't include 20
cards[i].memberFunction(/*....*/);
Run Code Online (Sandbox Code Playgroud)
更简单的是使用 std::vector
std::vector<Card> cards;
for( int i=0; i<20; ++i )
cards.push_back(Card(i, /*i as char +*/ "_Card.bmp"); )
Run Code Online (Sandbox Code Playgroud)
如果您想避免不必要的构造函数调用和不必要的大小调整,那么情况会更复杂,因为 C++ 通常会在分配每个对象时将其一一初始化。一种解决方法是以 Java 方式实现——使用循环和指针数组,如下所示:
Card *cards[20];
for (int i=0; i<20; i++) {
cards[i] = new Card(i);
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用 malloc 显式获取未初始化的内存:
Card *cards = malloc(20 * sizeof(Card));
for (int i=0; i<20; i++) {
new (&(cards[i])) Card(i);
}
Run Code Online (Sandbox Code Playgroud)
代码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"));
}
Run Code Online (Sandbox Code Playgroud)
请注意,您的for循环从0to 开始20,因此越过数组的末尾。