我读到可以通过以下代码声明一个对象数组:
Enemy * d = new Enemy[2];
但是当我尝试创建一个二维数组时,出现了无法初始化的错误。我也尝试过这样做:
Enemy *enemies[6][2];
但我不确定如何引用数组中的每个对象,以及如何将该引用传递给函数。
我读到可以通过以下代码声明一个对象数组:
Enemy * d = new Enemy[2];
但是当我尝试创建一个二维数组时,出现了无法初始化的错误。我也尝试过这样做:
Enemy *enemies[6][2];
但我不确定如何引用数组中的每个对象,以及如何将该引用传递给函数。
为了创建一个锯齿数组,您需要使用指向指针的指针。
Enemy** d = new Enemy*[6];
for (size_t i = 0; i < 6; ++i)
d[i] = new Enemy[2];
如果你打算创建一个固定大小的数组,你可以像创建普通数组一样创建它。Enemy enemies[6][2];
然后你只需要使用两个索引来引用它们。
enemies[2][1].roar();
注意:你会发现多维数组往往会比它们值得的头疼得多。保持单个维度数组更加清晰,只需基于行数和列数进行索引即可。
Enemy* enemies = new Enemy[rows * cols];
Enemy* getEnemy(size_t row, size_t col)
{
return enemies + (row * cols + col);
}
Enemy (*enemies)[2] = new Enemy[6][2];
但是没有间接操作就简单得多:
Enemy enemies[6][2];
对于C++,您应该使用std::vector而不是C数组。
std::vector<std::vector<Enemy> > d(6);
for (size_t i = 0; i < 6; ++i)
d[i].resize(2);
//now d is ready to use
d[1][2];
你会做
Enemy (*enemies)[2] = new Enemy[6][2];
也就是说,这是一个指向2个敌人数组的指针。 请注意,只有第一层数组可以成为指针,并且在运行时确定。
还要注意,您的第二个定义创建了一个包含6*2个敌人指针的数组。假设您已经初始化了它们所有,您可以访问它们如*enemies[j][k]
,或者如果每个指针本身指向一个数组,则为enemies[j][k][l]
。
请注意,如果您想要同时确定两个索引,您应该分配一个大数组并使用索引算术:
Enemy* enemies = new Enemy[6*2]; // 访问元素(j,k) enemy[6*j+k].fight();
当然,通常最好使用vector<Enemy>
,除非您的类Enemy
不适合于向量,例如因为它无法复制(或在C++11中移动)。此外,在进行多维数组时,理想情况下应该将数组和索引逻辑封装在一个类中。
Enemy**
传递,并传递两个维度。如果您创建了一个固定大小的数组,则需要声明至少一个维度。void kill(Enemy enemies[6][]);
- TheBuzzSaw