在我用Visual C++编写的平台游戏中,每个关卡最初将存储为整数的二维数组。我认为将此数组存储在类中更有意义,因此我创建了一个名为 Level 的类。它看起来像这样:
class Level {
private:
int map[20][30];
public:
Level(int a[20][30]) {
map = a;
}
int getcell(int row, int column) {
return map[row][column];
}
};
据我所知 - 从查找类构造函数的教程,并将二维数组作为参数传递,这应该有效,所以我真的不明白为什么它没有。
在我做map = a
的行上,我得到一个错误:Error: expression must be a modifiable lvalue
。我已经在stackoverflow上查找了此错误,但是我找不到与我的问题相关的任何答案。
那么,如何解决此错误呢?
这与构造函数没有任何关系。不能在C++中分配数组。无论是在构造函数中,还是在其他任何地方。
有两种方法可以解决它。第一种方法是蛮力方式。而不是
map = a;
编写一个循环以将数组的内容从构造函数的参数复制到类成员数组中。
第二种方法是将数组填充到中间类中:
class Level {
public:
struct level_map {
int map[20][30];
};
private:
level_map map;
public:
Level(const level_map &initial_map) : map(initial_map)
{
}
int getcell(int row, int column) {
return level_map.map[row][column];
}
};
这可能实用,也可能不实用,并且引入了更多的复杂性。
但这里真正的答案是使用 std::vector
s 而不是普通数组,这将解决所有这些问题。
其他人已经提到了真正的原因:你不能使用运算符将一个数组分配给另一个数组=
。我对你的课程的两分钱:
-
map
不是一个好名字,但如果在某处指定了using namespace std;
或using std::map
,它可能会与std::map
冲突。 - 恒定的数组大小使此类不可重用。类应该灵活,以允许任何 N*M 大小的 2D 数组。为此,最好使用
vector<vector<int>>
. -
getcell
应该是一个const
方法,它应该对传递的行号和列号进行错误检查。
如果希望此类具有静态大小的数组大小和编译时,则可以使用具有行和列大小的类模板作为非类型模板参数。
template<size_t row, size_t column>
class Level
{
int _map[row][column];
public:
Level(int src[row][column])
{
memcpy(_map, src, sizeof(_map)); // why not simply 'memcpy' ?
}
};
int main()
{
int source[10][2] = { {1, 2}, {3,4} };
Level<10, 2> ten_by_2(source);
}
这里的map
是一个常量值,不能作为左值赋值。这可以通过迭代数组的元素来解决,并将a[i][j]
分配给map[i][j]
。
class Level {
private:
int map[20][30];
public:
Level(int a[20][30]) {
for(int i = 0; i < 20; ++i)
for(int j = 0; j < 30; ++j)
map[i][j] = a[i][j];
}
int getcell(int row, int column) {
return map[row][column];
}
};