2016-02-26 24 views
0

我目前正在写一点点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(); 
} 

是否有实现这一目标的一个更优雅的方式?

+0

@MohitJain Code Review SE需要完整的工作代码。 –

+0

除非'GameObject'析构函数做了一些重要的事情(它可能不应该做一些重要的事!),当程序结束时没有必要删除它。它甚至可能会适得其反。我不认为游戏会在终止进程后无法清理的操作系统上运行。 –

+0

除此之外,你已经陷入早熟优化陷阱。 –

回答

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

'std :: vector'在堆上分配内存,不是吗? – muXXmit2X

+0

@ muXXmit2X它通常会有。 –

+0

完美!比这是我需要的。谢谢 :) – muXXmit2X

3

在现代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文件中的完整声明。

0

与把静态的头文件的问题是,C预处理器仅仅是一个相当愚蠢的宏观扩张。其结果是,对于你这个包括在每一个C文件,声明static object* = ...扩大。这相当于在每个cpp文件中写入该语句。不是你想要的。

你在找什么是单例模式这里有个很好的答案Difference between static class and singleton pattern?虽然它回答了关于静态类(实用程序类)的问题,但它也适用于此。

Loki图书馆有一个单独模板http://loki-lib.sourceforge.net/html/a00519.html,您可以使用它或仅将其用作示例来展示自己的更简单的版本。

这里有一篇关于Singleton模式https://sourcemaking.com/design_patterns/singleton

相关问题