我有一个包含指向类的指针向量的类。在其大多数成员函数中,我可以很好地访问和修改向量。但是,在一个函数中,甚至调用.size()或获取迭代器会导致程序中的段错误。
这是一个带有指向类的指针向量的类:
class floor
{
public:
floor(string imageFile, string a_walkwayFile, string waypointFile, int a_id, sf::Vector2i a_pos);
~floor();
int getId() { return id; };
void update(sf::RenderWindow* App);
sf::Sprite* getSprite() { return sprite; };
vector<int> parseCSVLine(string line);
void loadWalkways();
void convertToView(sf::RenderWindow* App, sf::View* view);
bool pointInWalkway(sf::Vector2f pt);
private:
vector<sf::RectangleShape*> walkWays;
sf::Sprite* sprite;
int id;
float scale;
string walkwayFile;
};
以下是将对象添加到向量中的片段:
walkWays.push_back(new sf::RectangleShape());
walkWays[walkWays.size() - 1]->setPosition(sf::Vector2f(parsedLine[0], parsedLine[1]));
walkWays[walkWays.size() - 1]->setSize(sf::Vector2f(parsedLine[2] - parsedLine[0], parsedLine[3] - parsedLine[1]));
walkWays[walkWays.size() - 1]->setFillColor(sf::Color(0,0,255,25));
walkWays[walkWays.size() - 1]->setOutlineColor(sf::Color::Blue);
walkWays[walkWays.size() - 1]->setOutlineThickness(3);
以下是一段代码片段,可以随时访问矢量:
void floor::update(sf::RenderWindow* App)
{
App->draw(*sprite);
for(int i = 0; i < walkWays.size(); ++i)
App->draw(*walkWays[i]);
}
现在这里是函数,每次调用或引用函数都会产生段错误:
bool floor::pointInWalkway(sf::Vector2f pt)
{
cout << walkWays.size() << endl; // this segfaults
if(walkWays.size() != 0) // this segfaults
for(vector<sf::RectangleShape*>::iterator it = walkWays.begin(); it != walkWays.end(); ++it) // this segfaults too!
if((*it)->getGlobalBounds().contains(pt.x, pt.y))
return true;
return false;
}
如何解决这个问题的任何指示将不胜感激!
答案 0 :(得分:0)
您的文件循环读取了一次,尝试使用具有此结构的循环:
string line;
getline(file, line);
while(file)
{
if(parsedLine.size() == 4)
{
walkWays.push_back(new sf::RectangleShape());
walkWays[walkWays.size() - 1]->setPosition(sf::Vector2f(parsedLine[0], parsedLine[1]));
walkWays[walkWays.size() - 1]->setSize(sf::Vector2f(parsedLine[2] - parsedLine[0], parsedLine[3] - parsedLine[1]));
walkWays[walkWays.size() - 1]->setFillColor(sf::Color(0,0,255,25));
walkWays[walkWays.size() - 1]->setOutlineColor(sf::Color::Blue);
walkWays[walkWays.size() - 1]->setOutlineThickness(3);
/*sf::RectangleShape* rect = new sf::RectangleShape();
rect->setPosition(sf::Vector2f(parsedLine[0], parsedLine[1]));
rect->setSize(sf::Vector2f((float)parsedLine[2] - parsedLine[0], (float)parsedLine[3] - parsedLine[1]));
rect->setFillColor(sf::Color(0,0,0,0));
//rect->setOrigin(sf::Vector2f(parsedLine[0], parsedLine[2]));
//cout << parsedLine[0] << ", " << parsedLine[1] << endl;
rect->setOutlineColor(sf::Color::Blue);
rect->setOutlineThickness(3);
walkWays.push_back(rect);*/
}
getline(file, line);
}
这可以防止您的文件读取一次或多次,并且会正确停止。