我读到你可以通过这行声明一个对象的颜色
Enemy * d = new Enemy[2];
但是当我试图制作一个二维数组时,出现了一个无法初始化的错误。我也试过这个
Enemy *enemies[6][2];
但我不确定如何引用该数组中的每个对象以及如何将该引用传递给函数。
答案 0 :(得分:10)
您需要使用指向指针的指针才能生成锯齿状数组。
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);
}
答案 1 :(得分:3)
如果你真的想在堆上分配一个2D数组,你可以这样做:
Enemy (*enemies)[2] = new Enemy[6][2];
但如果没有间接性,它会更简单:
Enemy enemies[6][2];
答案 2 :(得分:1)
对于C ++,你应该使用std :: vectors而不是C Arrays。
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];
答案 3 :(得分:0)
你做
Enemy (*enemies)[2] = new Enemy[6][2];
也就是说,指向2个敌人阵列的指针。 请注意,只有第一个数组级别可以成为指针,因此在运行时确定。
另请注意,您的第二个定义会创建一个6 * 2指向敌人的数组。假设您已将它们全部初始化,您可以将其作为*enemies[j][k]
访问,或者如果每个指针本身都指向一个数组,则为enemies[j][k][l]
。
请注意,如果您希望在运行时确定两个索引,则应分配一个大数组并使用索引算术:
敌人*敌人=新敌人[6 * 2]; //访问元素(j,k) 敌人[6 * J + K] .fight();
当然,通常最好使用vector<Enemy>
,除非您的课程Enemy
不适合矢量,例如因为它无法复制(分别在C ++ 11中移动)。此外,当以这种方式执行多维数组时,理想情况下,您应该将数组和索引逻辑封装在类中。