クラスへのポインターのベクトルを含むクラスがあります。そのメンバー関数のほとんどで、ベクターにアクセスして変更することができます。ただし、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;
}
これをどのように修正するかについての指針は大歓迎です!