0

こんにちは、C++ で OO 設計の Pacman の単純なバージョンを作成しています。2D 配列のコンテンツの表示に問題があります。配列には、マップ/迷路の壁を表す一連のシンボルが含まれています。私が書いたサンプルコードは次のとおりです。

ゲーム.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。または、単に an を使用してstd::array、通常の配列を忘れてください。

于 2013-05-25T02:14:40.813 に答える
0

あなたの質問にコメントしましたが、回答にすると良いと思いますので、ここにあります。

2 番目のオプションは正常に機能するはずです。 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 に答える