вектор c ++ с указателями на объекты - PullRequest
2 голосов
/ 04 января 2012

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

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

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();

, все значения будут совершенно разными

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

Где моя вина?

Редактировать: Запрошено еще несколько фрагментов:

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

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

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Поскольку вы не опубликовали код получения значений, сравните его и попытайтесь найти свою проблему ...

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 голосов
/ 04 января 2012

Зачем объявлять лабиринт как Field***?

Альтернатива C ++ - std::vector<std::vector<Field*> > maze;, и это то, что вы должны использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...