【发布时间】:2011-11-11 18:31:15
【问题描述】:
我读到你可以通过这一行声明一组对象
Enemy * d = new Enemy[2];
但是当我尝试创建一个二维数组时,出现了无法初始化的错误。我也试过这个
Enemy *enemies[6][2];
但我不确定如何引用该数组中的每个对象以及如何将该引用传递给函数。
【问题讨论】:
标签: c++ oop multidimensional-array reference
我读到你可以通过这一行声明一组对象
Enemy * d = new Enemy[2];
但是当我尝试创建一个二维数组时,出现了无法初始化的错误。我也试过这个
Enemy *enemies[6][2];
但我不确定如何引用该数组中的每个对象以及如何将该引用传递给函数。
【问题讨论】:
标签: c++ oop multidimensional-array reference
您需要使用指向指针的指针来创建锯齿状数组。
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** 传递并同时传递两个维度。如果你做了一个固定大小的数组,你需要声明至少一个维度。 void kill(Enemy enemies[6][]);
如果你真的想在堆上分配一个二维数组,你可以这样做:
Enemy (*enemies)[2] = new Enemy[6][2];
但如果没有间接,它会简单得多:
Enemy enemies[6][2];
【讨论】:
对于 C++,您应该使用 std::vectors 而不是 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 不适合向量,例如因为它不能被复制(分别在 C++11 中,移动)。此外,当以这种方式处理多维数组时,理想情况下,您应该将数组和索引逻辑封装在一个类中。
【讨论】: