在静态向量中调用对象c ++

时间:2017-02-26 12:00:33

标签: c++ static game-engine

我目前正在为学校项目制作c ++游戏引擎。为了更新说游戏中的可移动物体我想到了一个涉及所有可移动物体的静态矢量的方法:

  1. 创建可移动对象时,它会将自身添加到每个可移动对象共享的静态向量中。
  2. 当我需要在所有可移动对象中调用方法(在本例中为updatePosition)时,我只访问静态向量。
  3. 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

    这意味着移动可以将自身添加到矢量并创建一个新的移动或什么?所以它无限地增加了自己,但不幸的是我找不到导致这个错误的原因,这就是我在这里问的原因。感谢任何帮助,谢谢!

    编辑:当创建一个继承自可移动的对象时,会创建一个可移动的:

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

1 个答案:

答案 0 :(得分:1)

您在此处显示的代码:

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保持智能指针的向量。