初始化对象数组

Ste*_*ins 10 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");
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)

  • @Clodéric您还可以通过简单地预先分配向量来解决`push_back`的低效问题:`std::vector&lt;Card&gt;卡;card.reserve(20);` 这可以通过完美转发使用自定义构造函数参数调用 `emplace_back`:`cards.emplace_back(i, /*i as char +*/ "_Card.bmp");`。这似乎更具可读性/可维护性,因为它使用构造函数而不是强制初始化方法。 (2认同)

Pr0*_*ean 6

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


Mar*_*k B 5

代码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,因此越过数组的末尾。