0

嗨,我正在用 C++ 编写一个带有 OO 设计的简单版本的 Pacman。我在显示二维数组的内容时遇到问题。该数组包含一堆符号,它们代表地图/迷宫的墙壁。这是我编写的示例代码:

游戏.h

class Game
{
private:
    char map;
public:
    Game();
    void displayMap();
};

游戏.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".

但是如果我在头文件中定义数组的大小,并在定义构造函数时赋值

游戏.h

class Game
{
private:
    char map[10][20];
};

游戏.cpp

Game::Game()
{
    char map[10][20] = {...};
}

它会编译,但是当我尝试显示数组的内容(使用相同的代码displayMap())时,我发现它充满了垃圾。我认为这是因为该任务不是任务。它实际上是对堆栈上另一个数组的初始化,因此该数组在构造函数完成后被销毁,并且displayMap()此时显示原始未分配的数组。

我可能是错的,所以请随时纠正我。我需要关于如何构建游戏以避免此问题的建议

4

2 回答 2

1
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并忘记普通数组。

于 2013-05-25T02:14:40.813 回答
0

我评论了您的问题,但我认为将其作为答案会很好,所以就在这里。

第二个选项应该可以正常工作。 垃圾值在 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
于 2013-05-25T02:19:35.530 回答