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

10-11 22:51
查看更多