2017-02-26 4 views
-2

현재 학교 프로젝트를 위해 C++로 게임 엔진을 만들고 있습니다. 내가 모든 이동 객체의 정적 벡터를 포함하는 방법을 생각 게임에서 이동 객체 말을 업데이트하려면 다음과 같이 이동 객체가 생성 될 때정적 벡터로 객체 호출하기 C++

  1. , 그것은 모든 이동에 의해 공유되는 정적 벡터에 자신을 추가합니다.
  2. 모든 이동 가능한 객체에서 메소드 (이 경우 updatePosition)를 호출해야 할 때 정적 벡터에 액세스합니다.

Movable.h :

class Movable { 
private: 
    static vector<Movable*> movables; 
public: 
    Movable(); 
    static vector<Movable*> getMovable(); 
    virtual void updatePosition() = 0; 
}; 

Movable.ccp는

#include "Movable.h" 
vector<Movable*> Movable::movables; 
Movable::Movable() { 
    movables.push_back(this); 
} 

vector<Movable*> Movable::getMovable() { 
    return movables; 
} 

그래서, 기본적으로 이동을 생성 할 때마다 그것이 벡터 자체를 민다. 내 GameScene 클래스에서이 벡터에 액세스하려고합니다.

void GameScene::updateLogic() { 
    for (Movable* movable : Movable::getMovable()) { 
     movable->updatePosition(); 
    } 
} 

내 문제는 게임을 실행할 때 세그먼트 오류가 발생한다는 것입니다. 각 이동 가능한 대상물 차례로 각각 2 명 동산을 포함하는 벡터를 갖는 2 개 이동 가능한 물체를 포함하는 이동 벡터를 갖는 것처럼 ..... 같습니다 Debug output

이동은 벡터 자체를 가산하여를 생성 것을 의미 새로운 무언가 또는 무언가? 그래서 그것은 무한히 추가되지만 unfortuneatly 나는이 오류의 원인을 찾을 수 없습니다, 그래서 내가 여기 물었다. 어떤 도움이 appretiated, 감사합니다!

EDIT :

class Tank : public Drawable, public Entity, public Movable, public Collidable { 

private: 
... 

public: 
... 
    void updatePosition() override ; 
}; 

class HumanTank : public Tank { 
private: 
... 
public: 
... 
}; 

이 상기 GameScene 클래스의 생성자에서 생성된다 :

를 가동 상속 객체가 생성 될 때 가동을 만든
GameScene::GameScene(bool isAi, sf::Vector2u windowSize) { 
    sf::Vector2f tank1SpawnPoint {windowSize.x/20, windowSize.y - windowSize.y/8}; 
    HumanTank tank1 = HumanTank(tank1SpawnPoint, "tank1.png", "pipe1.png", "Tank 1", 100); 
} 
+0

'정적 인'벡터는 클래스의 모든 객체가 공유한다는 것을 의미합니다. 따라서 모든 객체에서 볼 수있는 것은 동일한 * 벡터입니다. –

+1

아마도 push_back 이후에 객체가 다른 메모리 위치로 이동했을 수 있습니다. 그러면 벡터의 포인터가 무효화되고 segfault가 설명됩니다. – emlai

+0

@BoPersson 나는 그것이 모든 이동 가능한 객체가 그 벡터에 추가 될 수 있고 또 다른 클래스로부터 얻을 수 있도록 정적 벡터를 사용하는 이유임을 알고있다. – Binbon

답변

1

여기에 표시되는 코드 :

(210)
GameScene::GameScene(bool isAi, sf::Vector2u windowSize) { 
    sf::Vector2f tank1SpawnPoint {windowSize.x/20, windowSize.y - windowSize.y/8}; 
    HumanTank tank1 = HumanTank(tank1SpawnPoint, "tank1.png", "pipe1.png", "Tank 1", 100); 

}

당신이 만들 수있는 가정 것을 제안하는 Movable (이 경우 HumanTank에) 어딘가에 다음 정적 벡터를 통해 글로벌 액세스 할 수 있습니다. 그러나 이것은 사실이 아닙니다.

GameScene::GameScene(/*...*/) { 
    sf::Vector2f tank1SpawnPoint {/*...*/}; 
    HumanTank tank1 = HumanTank(/*...*/);  // you create a Moveable 
               // and remember its location 
               // in memory 
} // <- here that object is destroyed and your pointer becomes invalid !!! 

대신에 당신이 스마트 포인터의 벡터를 유지하여 GameScene하기 위해 제안 원시 포인터의 정적 벡터를 사용하여 : 정말로 계속하는 것은 이것이다.

+0

고마워, 이것을 생각하지 않았다. GameScene의 .h 파일에서 tank1을 선언하고 생성자의 초기화 목록에 생성하면 내 문제가 해결됩니다 :) – Binbon