嗨,我正在用C++编写一个具有OO设计的简单版本的Pacman。我在显示2D阵列的内容时遇到问题。这个阵列由一堆符号组成,这些符号代表地图/迷宫的墙壁。这是我写的示例代码:
Game.h
class Game
{
private:
char map;
public:
Game();
void displayMap();
};
Game.cpp
char map[10][20] = {...};
void Game::displayMap()
{
for(int i = 0; i < 10; i++)
{
for(int j = 0; j < 20; j++)
{
cout << map[i][j] << " ";
}
cout << endl;
}
}
编译器将在[i]
处弹出一个错误,称为"expression must have pointer-to-object type"
。
但是,如果我在头文件中定义数组的大小,并在定义构造函数时分配其值
Game.h
class Game
{
private:
char map[10][20];
};
Game.cpp
Game::Game()
{
char map[10][20] = {...};
}
它会编译,但当我尝试显示数组的内容(使用displayMap()
的相同代码(时,我发现它充满了垃圾。我想这是因为那项任务不是一项任务。它实际上是对堆栈上另一个数组的初始化,因此在构造函数完成后,数组将被销毁,此时的displayMap()
将显示原始未分配的数组。
我可能错了,所以请随时纠正我。我需要一个关于我应该如何构建游戏以避免这个问题的建议
Game::Game() {
char map[10][20] = {...};
}
在这里,您使用与实例变量相同的名称重新声明一个局部变量,因此您隐藏了外部变量。此外,您正在尝试分配给以前声明过的数组,这在C++中是不可能的。您可以在声明数组时对其进行初始化,而不是事后初始化。
你可以这样做(如果你有C++11支持(:
class Game {
char map[W][H] = { ... };
}
或者你可以这样做:
class Game {
char map[W][H];
Game() {
char tmp[W][H] = { ... };
memcpy(map, tmp, sizeof(char)*W*H);
}
}
更好的是,您可以使用std::copy
。或者更好的是,只使用std::array
,而忽略普通数组。
我评论了你的问题,但我认为最好把它作为一个答案,所以它在这里。
第二种选择应该很好。垃圾值在C/C++中是正常的
您要做的是在构造函数(Game::Game(((中初始化您的值。在这些情况下应该使用构造函数。
C/C++的行为是不分配默认值,它只是"获取RAM中的内容"。不过,其他语言确实会初始化RAM单元。这完全取决于你使用的编程语言。
在构造函数中包含此代码(在访问map[]之前(应该可以工作:
for (int ix = 0; ix < 10; ix++)
for (int jx = 0; jx < 20; jx++)
map[ix][jx] = "x"; // x will be your default value