C++如何在OO设计中显示多维数组

C++ how to display multidimentional array in OO design

本文关键字:显示 数组 OO C++      更新时间:2023-10-16

嗨,我正在用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