1

我有一个类,它包含一个指向类的指针向量。在它的大多数成员函数中,我可以很好地访问和修改向量。但是,在一个函数中,即使调用 .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;
}

任何有关我将如何解决此问题的指示将不胜感激!

4

1 回答 1

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

这可以防止您的文件读取一到多次,并且会正确停止。

于 2013-05-20T02:51:35.437 回答