全球矢量&的push_back

时间:2018-04-01 05:35:16

标签: c++ vector stdvector

我有一个名为GameObject的类,我正在尝试将自身的实例存储到std::vector gameObjectList push_back GameObject函数中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.h

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

GameObject.cpp

engine.cpp

我已将此标头文件包含在我的gameObjectList中,并且我希望能够访问#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.cpp(摘录)

GameObject

(Engine.h包含GameObject.h)

我已经触发了断点,试图了解它是如何发挥作用的,当我在构造函数中时,它成功地将std::vector添加到0,但是一旦你不在构造函数中它几乎就好像整个矢量都会自行消失,因为它的大小和内容都会回到# x x x <-- intersection c=[[1,2], [2,3]] b=[[1,2], [2,0]] 。请帮助我理解我做错了什么,并希望我能做到能够全局访问这个载体。

1 个答案:

答案 0 :(得分:2)

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

下面的代码将游戏对象的副本插入到矢量中。我确信,那不是你想要的。

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有自己的空向量。

您应该在.h

中声明向量
extern std::vector<GameObject*> gameObjectList;

并将其定义为.cpp

中的一个且仅一个
std::vector<GameObject*> gameObjectList;

不是使用extern,而是将其声明为static类成员。