我目前正在编写一个小的textbase advendture游戏,我想集中创建所有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();
}
是否有更优雅的方法来实现这一目标?
答案 0 :(得分:3)
在Modern C ++中,通常可以避免保存原始指针。在您的情况下,您可以在向量中使用std :: shared_ptr或std :: unique_ptr。我可能会从我看到的内容中使用shared_ptr。
std::shared_ptr<GameObject> apple = std::make_shared <GameObject>("Apple", [] () { std::cout << "Delicous apple!" << std::endl; return true; });
你也不会把它放在头文件中。你只有:
std::shared_ptr<GameObject> apple;
标题中的和单个.cpp文件中的完整声明。
答案 1 :(得分:3)
当您在头文件中使用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; }),
...
};
答案 2 :(得分:0)
在头文件中放置静态的问题是C预处理器只是一个相当愚蠢的宏扩展器。结果是,对于包含此文件的每个C文件,语句static object* = ...
都会被扩展。这相当于在每个cpp文件中编写该语句。不是你想要的。
你要找的是单例模式,这里有一个很好的答案Difference between static class and singleton pattern?虽然它是关于静态类(实用程序类)的问题,但它也适用于此。
Loki库有一个单独的模板http://loki-lib.sourceforge.net/html/a00519.html,你可以使用它,或者只是用它作为一个例子来推广你自己的简单版本。
这里有关于单身人士模式https://sourcemaking.com/design_patterns/singleton
的文章