我有一个名为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; }
还有一个网格类,通过二维矢量跟踪其上的所有对象。在头文件中,有那个向量:
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&lt;&lt; gr-&gt; getGridPosition(0,0) - &gt; 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);
}
答案 0 :(得分: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);
中):
typedef
并考虑使用std::vector<gridObject*>
为{{1}}创建别名:)