C++ 集中创建供以后使用的对象

C++ 集中创建供以后使用的对象,c++,C++,我目前正在编写一个textbase advendture小游戏,我想集中创建所有游戏对象,以便以后使用它们的浅拷贝来节省一些内存。我现在这样做的方式是在一个额外的头文件中创建一个静态实例,该头文件将在程序终止时被删除 下面是我现在正在做的一个简化示例: #ifndef OBJECTS_H_ #define OBJECTS_H_ #include "GameObject.h" #include <iostream> static GameObject *apple = new G

我目前正在编写一个textbase advendture小游戏,我想集中创建所有
游戏对象
,以便以后使用它们的浅拷贝来节省一些内存。我现在这样做的方式是在一个额外的头文件中创建一个
静态
实例,该头文件将在程序终止时被删除

下面是我现在正在做的一个简化示例:

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