0

我有一个名为 gridObject 的基类

这是头文件:

#ifndef ITEM_H
#define ITEM_H

class gridObject
{
public:
    gridObject();
    virtual ~gridObject();

    virtual int get_GridID() = 0;

    virtual int get_x() = 0;
    virtual int get_y() = 0;

    virtual int get_direction() = 0;

    void set_x(int x);
    void set_y(int y);

    void set_direction(unsigned int direction);

protected:
private:
    int _x;
    int _y;

    unsigned int _direction;
};

#endif // ITEM_H

我有一个名为 player 的子类

这是类文件中的 get_GridID() 方法:

int player::get_GridID() { return 2; }

还有一个网格类通过 2d 向量跟踪其上的所有对象。在头文件中,有那个向量:

private:
    vector<vector<gridObject*> > _position;

以下是分别在特定位置设置和获取对象的方法:

void grid::setGridPosition(int x, int y, gridObject* obj) { _position[y][x] = obj; }
gridObject* grid::getGridPosition(int x, int y) { return _position[y][x]; }

我遇到的问题在这里:

int main()
{
    grid * gr = new grid(10, 10);

    player p(0, 0, 100);

    gridObject * go = &p;

    gr->setGridPosition(0, 0, go);

    cout << gr->getGridPosition(0, 0)->get_GridID();

    return 0;
}

它在以下位置崩溃: cout << gr->getGridPosition(0, 0)->get_GridID();

我已经包含了所有适当的头文件。

编辑:这是网格的构造函数和_position的初始化:

grid::grid(int width, int length)
{
    setSize(width, length);
}


void grid::setSize(int width, int length)
{
    setLength(length);
    setWidth(width);
}

void grid::setLength(int val) { _position.resize(val); }

void grid::setWidth(int val)
{
    for(unsigned int i = 0; i < _position.size() - 1; i++)
        for(unsigned int j = 0; j < _position.at(i).size() - 1; j++)
           _position.at(i).resize(val);
}
4

1 回答 1

0

您正在使用向量的向量:

vector<vector<gridObject*> > _position;

但您初始化的方式_position如下:

_position.resize(length);
for(unsigned int i = 0; i < _position.size() - 1; i++)
    for(unsigned int j = 0; j < _position.at(i).size() - 1; j++)
       _position.at(i).resize(width);

请注意,第一个resize构造length类型的对象vector<gridObject*>。然后,您不是通过这些新构建的向量进行迭代,而是通过它们的元素(第二个嵌套循环)进行迭代,在这种情况下,这会导致该行_position.at(i).resize(width);永远不会执行,从而_position[y][x] = obj尝试访问无效内存,从而导致您观察到的未定义行为作为分段过错。

试试这个(在grid::setSize):

_position.resize(length);
for(unsigned int i = 0; i < _position.size() - 1; ++i)
    _position[i].resize(width);

并考虑使用typedefstd::vector<gridObject*>:)创建别名

于 2013-08-28T06:45:32.897 回答