1

クラスへのポインターのベクトルを含むクラスがあります。そのメンバー関数のほとんどで、ベクターにアクセスして変更することができます。ただし、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;
};

以下は、whee オブジェクトがベクターに追加されるスニペットです。

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