我有一个名为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]]
。请帮助我理解我做错了什么,并希望我能做到能够全局访问这个载体。
答案 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
类成员。