gpt4 book ai didi

c++ - 集中创建对象供以后使用

转载 作者:太空宇宙 更新时间:2023-11-04 15:35:20 24 4
gpt4 key购买 nike

我目前正在编写一个小的基于文本的冒险游戏,我想在其中集中创建所有 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

主要.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,然后在单个源文件中实际定义对象。我还建议不要将对象声明为指向对象的指针,而是将它们声明为普通对象实例。当您需要指针时使用寻址运算符,但尽量避免使用它并尽可能使用引用。

或者,如果您创建一个包含所有对象的 vector ,为什么要在头文件中声明这些对象,除非您想访问一些特殊对象?相反,您可以在 vector 中全部内联创建它们,然后仅在头文件中声明 vector :

// 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com