我读到你可以在这一行声明一个对象数组
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);
}
如果你真的想在堆上分配一个2D数组,你可以这样做:
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]
。
请注意,如果您希望在运行时确定两个索引,则应该分配一个大数组并使用索引算法:
敌人*敌人=新敌人[6*2];//访问元素(j,k)敌人(6 * j + k) .fight ();
当然,通常最好使用vector<Enemy>
,除非你的类Enemy
不适合向量,例如,因为它不能被复制(参见第3章)。在c++ 11中,已移动)。此外,当以这种方式处理多维数组时,理想情况下应该将数组和索引逻辑封装在一个类中。