集中创建对象供以后使用

时间:2016-02-26 10:57:24

标签: c++

我目前正在编写一个小的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();
}

是否有更优雅的方法来实现这一目标?

3 个答案:

答案 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

的文章