我目前正在编写一个小型的文本冒险游戏,我想集中创建所有GameObjects
,以便以后可以使用它们的浅表副本来节省一些内存。我现在这样做的方式是在一个额外的头文件中创建一个static
实例,该文件将在程序终止时被删除。
这是我现在正在做的简化示例:
#ifndef OBJECTS_H_
#define OBJECTS_H_
#include "GameObject.h"
#include <iostream>
static GameObject *apple = new GameObject("Apple", [] () { std::cout << "Delicous apple!" << std::endl; return true; });
void deleteAll()
{
delete apple;
}
#endif
main.cpp:
#include <iostream>
#include <vector>
#include "GameObject.h"
#include "Objects.h"
using namespace std;
int main()
{
std::vector<GameObject*> objects{apple, apple};
try
{
objects[0]->use();
objects[1]->use();
}
catch (const GameObjectException &goe)
{
cout << goe.what() << endl;
}
deleteAll();
}
有没有更优雅的方式实现这一目标?
最佳答案
当您在头文件中使用static
对象时,包含该头文件的每个translation unit都将具有该静态对象的自己的实例,而不会与程序的其余部分共享。
如果您有多个源文件,则可以将它们声明为extern
而不是使对象静态化,然后在单个源文件中实际定义对象。我还建议不要将对象声明为指向对象的指针,而应将它们声明为普通的对象实例。需要指针时,请使用address-of运算符,但应尽量避免使用它,而应尽可能使用引用。
另外,如果您创建所有对象的向量,那么为什么要在头文件中声明所有对象,除非您要访问某些特殊对象?相反,您可以在向量中全部内联创建它们,然后仅在头文件中声明向量:
// In header file
extern std::vector<GameObject> objects;
// In source file (as a global variable)
std::vector<GameObject> object = {
GameObject("Apple", [] () { std::cout << "Delicous apple!" << std::endl; return true; }),
...
};
如果需要使用指针,请改用
std::shared_ptr
:// In header file
extern std::vector<std::shared_ptr<GameObject>> objects;
// In source file (as a global variable)
std::vector<std::shared_ptr<GameObject>> object = {
std::make_shared<GameObject>("Apple", [] () { std::cout << "Delicous apple!" << std::endl; return true; }),
...
};
关于c++ - 集中创建对象以备后用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35649902/