c++ - 全局 vector 和 Push_Back

标签 c++ vector stdvector

我有一个名为 GameObject 的类,我正在尝试将其实例存储到 std::vector 中,该类由 调用 gameObjectList GameObject 构造函数中的 >push_back 函数。

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

游戏对象.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,但是一旦您离开构造函数,整个 vector 就好像自己删除一样,因为大小和内容都返回到 0。请帮助我理解我做错了什么,并希望我应该做些什么才能在全局范围内访问这个 vector 。

最佳答案

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

下面的代码将游戏对象的拷贝插入 vector 中。我敢肯定,这不是您想要的。

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 中,您将新元素添加到 vector 中,另一个 .cpp 中有自己的空 vector 。

你应该在 .h 中声明 vector

extern std::vector<GameObject*> gameObjectList;

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

std::vector<GameObject*> gameObjectList;

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

关于c++ - 全局 vector 和 Push_Back,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595129/

相关文章:

C++:修改 shared_ptr 元素的 vector

c++ - 在 vector 中存储各种类型

c++ - 所有排列 C++ 与 vector <int> 和回溯

c++ - C++ 中的二进制读/写任意 std::vector<std::vector<int>>

c++ - 内部模板类型 std::vector<std::vector<T>> 的函数模板重载或专门化

c++ - 使用 C++ 将子类与父类链接的方法

C++ Qt QTableWidget 项目在调整列大小时移动

c++ - 我们如何在 C++ 的类构造函数中初始化 std::vector?

c++ - 在不排序的情况下搜索数组中的重复项的最快方法是什么?

c++ - 从不可排序的 vector 中删除重复项