2012-01-04 5 views
2

Я должен реализовать небольшую и простую игру в C++ (лабиринте), и у меня есть некоторые проблемы прямо сейчас.C++ vector с указателями объектов

Некоторые фрагменты: У меня есть массив объектов указателей, который представляет свои поля в лабиринте

Field*** maze; 

инициализации лабиринта:

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; 
    } 
} 

При создании лабиринта мне нужен список уже посещенных полей и стопки , поэтому я сделал:

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

Позже я хочу поставить поле * в мой стек

stack.push_back(neighbour); 

Но после этого толчка все значения в объекте неверны. Даже если я попробовать

neighbour = stack.back(); 

всех значения укомплектовать разные

Я уже каштановые темы по этой теме, и именно поэтому я выбрал вектор указателей, а не объекты.

Где моя вина?

Edit: еще несколько фрагментов в соответствии с просьбы:

Конечно, я выделить память для самого

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

Не могли бы вы дать немного больше кода? Например, какой тип «сосед»? Как он инициализируется? (Похоже, что вы можете вставить указатель на локальную переменную в '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 >> лабиринт, если доступен C++ 11, или с помощью' boost :: shared_ptr'/'std :: tr1 :: shared_ptr 'вместо этого, если это не так. – codeling

+2

Еще лучше: MAZE_HEIGHT и MAZE_WIDTH кажутся постоянными => Лабиринт поля [MAZE_WIDTH] [MAZE_HEIGHT] ;. Затем, когда вам нужно вставить вектор vector.push_back (& ​​maze [x] [y]); – Errata

+0

Я объявил лабиринт, как вы сказали, но я все равно получаю ту же ошибку, когда пытаюсь «stack.push_back (соседа)» – soupdiver