C++ 集中创建供以后使用的对象
我目前正在编写一个textbase advendture小游戏,我想集中创建所有C++ 集中创建供以后使用的对象,c++,C++,我目前正在编写一个textbase advendture小游戏,我想集中创建所有游戏对象,以便以后使用它们的浅拷贝来节省一些内存。我现在这样做的方式是在一个额外的头文件中创建一个静态实例,该头文件将在程序终止时被删除 下面是我现在正在做的一个简化示例: #ifndef OBJECTS_H_ #define OBJECTS_H_ #include "GameObject.h" #include <iostream> static GameObject *apple = new G
游戏对象
,以便以后使用它们的浅拷贝来节省一些内存。我现在这样做的方式是在一个额外的头文件中创建一个静态
实例,该头文件将在程序终止时被删除
下面是我现在正在做的一个简化示例:
#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
\ifndef对象_
#定义对象_
#包括“GameObject.h”
#包括
静态游戏对象*苹果=新游戏对象(“苹果”,[](){std::cout use();
}
捕获(常量GameObjectException和goe)
{
Cux在现代C++中,通常避免保存原始指针。在这种情况下,可以在你的向量中使用STD::SydDypPTR或STD::UnQuyJ-PTR。
std::shared_ptr<GameObject> apple = std::make_shared <GameObject>("Apple", [] () { std::cout << "Delicous apple!" << std::endl; return true; });
<代码> > STD::SypDypPTReAP= STD::Apple共享(“Apple”,[]):STD::CUT在现代C++中,通常避免保存原始指针。在这种情况下,可以使用STD::SydDypPTR或STD::UnQuyJ-PTR在向量中。我可能会从我所看到的使用SydDypTR。
std::shared_ptr<GameObject> apple = std::make_shared <GameObject>("Apple", [] () { std::cout << "Delicous apple!" << std::endl; return true; });
std::shared_ptr apple=std::make_shared(“苹果”),[](){std::cout在头文件中放入static的问题是,C预处理器只是一个相当愚蠢的宏扩展器。结果是,对于每个包含它的C文件,语句static object*=…
都会展开。这相当于在每个cpp文件中写入该语句。这不是您想要的
你想要的是单例模式,这里有一个很好的答案,虽然它是在回答一个关于静态类(实用类)的问题,但它也适用于这里
Loki库有一个单例模板,您可以使用它,也可以将它作为一个示例来滚动您自己的更简单版本
这里有一篇关于单例模式的文章在头文件中放入静态的问题是C预处理器只是一个相当愚蠢的宏扩展器。结果是,对于每个包含该宏的C文件,语句static object*=…
都会被扩展。这相当于在每个cp中写入该语句p文件。不是你想要的
你想要的是单例模式,这里有一个很好的答案,虽然它是在回答一个关于静态类(实用类)的问题,但它也适用于这里
Loki库有一个单例模板,您可以使用它,也可以将它作为一个示例来滚动您自己的更简单版本
这里有一篇关于单例模式的文章当你在头文件中使用静态
对象时,每个包含头文件的地方都有它自己的静态对象实例,它不会与程序的其余部分共享
如果您有多个源文件,那么与其使对象保持静态,不如将它们声明为extern
,然后在单个源文件中实际定义对象。我还建议不要将对象声明为指向对象的指针,而只将其声明为普通对象实例。需要时使用运算符的地址一个指针,但尽量避免使用它,并在可能的情况下使用引用
或者,如果创建所有对象的向量,为什么要在头文件中声明这些对象,除非您想访问一些特殊对象?相反,您可以在向量中内联创建它们,然后只在头文件中声明向量:
// 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; }),
...
};
当您在头文件中使用static
对象时,包含该头文件的每个位置都将有它自己的静态对象实例,它不会与程序的其余部分共享
如果您有多个源文件,那么与其使对象保持静态,不如将它们声明为extern
,然后在单个源文件中实际定义对象。我还建议不要将对象声明为指向对象的指针,而只将其声明为普通对象实例。需要时使用运算符的地址一个指针,但尽量避免使用它,并在可能的情况下使用引用
或者,如果创建所有对象的向量,为什么要在头文件中声明这些对象,除非您想访问一些特殊对象?相反,您可以在向量中内联创建它们,然后只在头文件中声明向量:
// 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; }),
...
};
@MohitJain Code Review SE需要完整的工作代码。除非Game Object
析构函数做了一些重要的事情(而且它可能不应该做一些重要的事情!),在程序结束时删除它是没有意义的。它甚至可能适得其反。我不认为游戏运行在进程终止后无法清理的操作系统上。除此之外,你已经落入了过早优化的陷阱。@MohitJain Code Review SE需要完整的工作代码。除非Game Object
析构函数做了一些重要的事情(它可能不应该做一些重要的事情!),在程序结束时删除它是没有意义的。它甚至可能适得其反。我不认为游戏运行在进程终止后无法清理的操作系统上。除此之外,你已经落入了过早优化的陷阱。std::vector
确实在堆上分配了内存,不是吗?@muXXmit2X it typIlly是的。完美!这是我需要的。谢谢:)std::vector在堆上分配内存,不是吗?@muXXmit2X通常是的。完美!这是我需要的。谢谢:)
// 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; }),
...
};