2012-01-04 6 views
2

C++(迷路)で小さくシンプルなゲームを実装する必要があり、今はいくつかの問題があります。オブジェクトポインタ付きのC++ベクトル

一部抜粋:私は必要な迷路を作成する場合

for (n = 0; n < MAZE_WIDTH; n++) { 
    this->maze[n] = new Field*[MAZE_HEIGHT]; 
    for (p = 0; p < MAZE_HEIGHT; p++) { 
     this->maze[n][p] = new Field(); 
     this->maze[n][p]->x = n; 
     this->maze[n][p]->y = p; 
    } 
} 

: 私は迷路迷路の

Field*** maze; 

initの中の私のフィールドを表すオブジェクトポインタの配列を持っていますすでに訪問したフィールドのリストとスタック だから私はした:

std::vector<Field*> visited; 
std::vector<Field*> stack; 

は、その後、私は私のスタック

stack.push_back(neighbour); 

にフィールド*を入れたい。しかし、このプッシュした後、オブジェクトのすべての値が間違っています。私はすでにこのトピックに関するいくつかのスレッドを赤

私がしようとした場合でも

neighbour = stack.back(); 

すべての値はcompletly異なるものであり、私はポインタではなくオブジェクトのベクトルを選んだ理由です。

私の責任はどこですか?

編集:要求されたとして いくつかのより抜粋:私はチームメイト自体

this->maze = new Field**[MAZE_WIDTH]; 

フィールドにメモリを割り当てるもちろん

は次のようになります単純なクラスです:

class Field { 
public: 
    Field(); 
~Field(); 
bool w_left; 
bool w_right; 
bool w_front; 
bool w_back; 
unsigned int x; 
unsigned int y; 
private: 
}; 
+0

スタックに追加するたびに同じフィールド参照を偶然変更することはありませんか?これにより、すべての値が同じで、最後に追加された値と同じになります。 – Tudor

+3

もう少しコードを教えてください。例えば、 "neighbour"のタイプは何ですか?どのように初期化されますか? (ローカル変数へのポインタを 'vector'に挿入しているように聞こえるかもしれませんが、より多くのコードを書くことは不可能です。) –

+0

コードスニペットかもしれませんが、' new Field ** [ ] '最初に?また、ポインタへのポインタへのポインタより多次元配列を扱う方が簡単だと思います。 – slaphappy

答えて

2

あなたが値を取得する方法のコードを掲載していない、ので、 はこれに比較して、あなたの問題を探してみてください...

std::vector<std::vector<Field*> > maze; 

    // Ini 
    for(int i = 0; i < MAZE_WIDTH; i++) 
    { 
     maze.push_back(std::vector<Field*>()); 
     for(int j = 0; j < MAZE_HEIGHT; j++) 
     { 
      maze[i].push_back(new Field()); 
      maze[i][j]->x = i; 
      maze[i][j]->y = j; 
     } 
    } 

    std::vector<Field*> visited; 

//は、フィールド[4を押します5]訪問したベクトルに

visited.push_back(maze[4][5]); 


    // Clean up 
    for(size_t i = 0; i < maze.size(); i++) 
    { 
     for(size_t j = 0; j < maze[i].size(); j++)  
      delete maze[i][j];  
    } 
+0

ええ、 ) – soupdiver

0

なぜ迷路をField***と宣言しますか?

C++の代替案はstd::vector<std::vector<Field*> > maze;です。これを使用する必要があります。

+2

、さらには 'std :: vector >> maze'、あるいはboost :: shared_ptr' /' std :: tr1 ::代わりにshared_ptr 'を使用します。 – codeling

+2

さらに良い:MAZE_HEIGHTとMAZE_WIDTHは一定のようです=>フィールド迷路[MAZE_WIDTH] [MAZE_HEIGHT] ;.そして、あなたがベクトルstack.push_back(&maze [x] [y])に挿入する必要があるとき。 – Errata

+0

あなたが言ったように私は迷路を宣言しましたが、 'stack.push_back(neighbor)'しようとすると同じエラーが発生します – soupdiver

関連する問題