soupdiver
soupdiver

Reputation: 3683

c++ vector with object pointers

i have to implement a small and simple game in c++ (a maze) and I have some problems right now.

Some snippets: I've got an array of object pointers which represents my fields in the maze

Field*** maze;

init of the 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;
    }
}

When creating the maze i need a list of already visited fields and a stack so I did:

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

Then later I want to put a Field* into my stack

stack.push_back(neighbour);

But after this push all values in the object are wrong. Even if i try

neighbour = stack.back();

all the values are completly different

I already red some threads about this topic and that's why i chose a vector of pointers and not objects.

Where is my fault?

Edit: Some more snippets as requested:

Of course I allocate memory for the mate itself

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

Field is a simple class which looks like:

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

Upvotes: 2

Views: 1074

Answers (2)

Jo&#227;o Augusto
Jo&#227;o Augusto

Reputation: 2305

Since, you didn't posted the code of how you are obtaining the values, compare to this, and try to find your problem...

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;

// push the field [4,5] in a visited vector

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

Upvotes: 2

Luchian Grigore
Luchian Grigore

Reputation: 258648

Why declare the maze as Field***?

The C++ alternative is std::vector<std::vector<Field*> > maze;, and that's what you should use.

Upvotes: 0

Related Questions