全局矢量 & Push_Back

Global Vector & Push_Back

我有一个名为 GameObject 的 class,我试图通过 push_back 中的函数将其自身的实例存储到一个名为 gameObjectListstd::vector 中=14=]构造函数。

GameObject.h

class GameObject;

static unsigned int gameObjectCount = 0;
namespace {
    static std::vector<GameObject> gameObjectList;
}

class GameObject {

public:

    Transform transform;

    std::string tag;
    std::string name;
    unsigned int objectID;

    bool active = true;

    GameObject findGameObject(std::string Name);
    std::vector<GameObject> findGameObjectsWithTag(std::string Name);

    void Update();
    void addComponent(Component component);
    Component getComponent(std::string type);
    std::vector<Component> getComponents(std::string type) const;

    void setActive(bool value);

    GameObject(std::string Name = ("GameObject" + gameObjectCount), Transform transform = Transform());

private:

    std::vector<Component> mComponents;
};

GameObject.cpp

#include "../Headers/gameobject.h"

GameObject::GameObject(std::string Name, Transform transform)
{
    tag = "default";
    name = Name;
    objectID = gameObjectCount;
    mComponents.push_back(transform);
    this->transform = transform;

    gameObjectCount++;
    gameObjectList.push_back(*this);
}

我将这个头文件包含在我的 engine.cpp 中,我希望能够访问 gameObjectList 来做这样的事情,例如:

Engine.cpp(摘录)

#incldue "../Headers/engine.h"

void Engine::run()
{
    if (this->init() != 1)
    {
        std::cout << std::endl << "[SYS] Couldn\'t Initialise Engine" << std::endl;
        shutdown();
    }
    std::cout << std::endl << "[SYS] Engine Completely Initialised!" << std::endl;

    mState = EngineState::RUNNING;
    while (!glfwWindowShouldClose(mWindow.getWindow()))
    {
        /*OpenGL stuff here*/

        this->update();

        std::cout << int(gameObjectList.size()) << std::endl;
        for (int x = 0; x < (int)gameObjectList.size(); x++)
            gameObjectList[x].Update();

        glfwSwapBuffers(mWindow.getWindow());
        glfwPollEvents();
    }

    std::cout << std::endl << "[SYS] !-------------------!" << std::endl;
    std::cout << "[SYS] Shutting Down Engine" << std::endl;
    std::cout << "[SYS] !-------------------!" << std::endl;
    shutdown();
}

(Engine.h 包括 GameObject.h)

我触发了断点试图跟踪它是如何运行的,当我在构造函数中时,它成功地将 GameObject 添加到 std::vector,但是一旦你离开构造函数几乎就好像整个向量都自行擦除一样,因为大小和内容都回到 0。请帮助我理解我做错了什么,并希望我应该做些什么才能在全球范围内访问这个向量。

你没有提供完整的代码,尤其是析构函数的代码。所以我只猜你的问题。

下面的代码将游戏对象的副本插入向量中。我敢肯定,那不是你想要的。

gameObjectList.push_back(*this);

您应该重构您的代码,可能如下所示。

static std::vector<GameObject*> gameObjectList;
// ...
gameObjectList.push_back(this);

UDATE OP 粘贴完整代码后。

.h 中的匿名命名空间和静态全局是无用的。

namespace { static std::vector<GameObject> gameObjectList; }

它使每个 .cpp 都拥有自己的和不同的 gameObjectList。在一个 .cpp 中,您将新元素添加到向量中,另一个 .cpp 中有自己的空向量。

您应该在 .h 中声明向量

extern std::vector<GameObject*> gameObjectList;

并在其中一个.cpp中定义它

std::vector<GameObject*> gameObjectList;

与其使用 extern,不如将其声明为 static class 成员。