C++如何在OO设计中显示多维数组
C++ how to display multidimentional array in OO design
嗨,我正在用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
- 显示数组中的学生 ID 和最高分
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 为什么断点显示数组的第二个值是一个大数字?额外学分工作
- 使用指针显示数组的值
- 我无法显示包含整数最大值的索引. 但我可以显示数组中整数的最高值
- 数组:如何在指定索引之前显示数组的第一个和最后一个元素以及数组元素的差异?
- 使用增量/减少操作员在C 中显示数组的奇怪结果
- 将25个甚至整数存储到一个名为intlist的整数阵列中,然后在屏幕上显示数组,并在屏幕上显示名为fivintegers
- 显示数组的问题.一切都放在一个单独的行中,但不放入单独的列中
- strlen 显示数组元素的数量错误
- 我的函数不会用" "替换".",也不会按预期显示数组
- 以C++为单位乘以并显示数组的值
- 找不到标识符,尝试在 C++ 中显示数组值
- 如何显示数组名称中的名称
- 在列表小部件 Qt C++中显示数组内容
- c++将.txt文件中的字符串添加到字符串数组中,并显示数组的值
- C++如何将数组传递给函数,然后调用它来显示数组的值
- 从函数更新(覆盖)和显示数组
- 在单独的数据中显示数组数据
- 仅显示数组文本文件中的第一个字母