我有一个类 imgmanager ,它允许我加载我的所有图像一次,它非常好,并且在原型设计时我将所有文件放在一个地方,所以我没有必要担心周期性定义。但是在分离了所有课程后,我遇到了一个问题。
我的标题文件
#ifndef IMAGEMANAGER_H
#define IMAGEMANAGER_H
#include "Img.h"
#include <vector>
#include <map>
#include <string>
class imgmanager{
protected:
std::vector<sf::Image*> images;
std::map<std::string,int> positions;
public:
sf::Image* addimg(std::string path); //relative to resources
sf::Image* getimg(std::string path);
int size();
virtual ~imgmanager();
sf::Image* operator[](int);
}imagemgr;
#endif
在}之后和之前创建的实例;我的编译器抱怨我:
所以我问:我应该怎样做才能拥有imagemgr类的全局实例?我应该只创建一个全局头文件并创建一个实例吗? (在这种特殊情况下,我可以在main.cpp中创建一个全局变量,没有一个头需要实例)
答案 0 :(得分:4)
不要在标题中创建对象实例。
在一个源文件中创建对象实例。
如果您需要跨多个翻译单元访问它,请将其放在标题中:
extern imgmanager imagemgr; // declaration
这将通知所有可以“看到”标题的代码,这些代码存在一个如此命名的对象;但它仍然只会在您编写的一个源文件中实际定义:
imgmanager imagemgr; // definition
(这类似于在标头中声明函数的方式,但在恰好一个源文件中定义:
void f(); // declaration
void f() { ... } // definition
)
上面提到的一般性建议,如果你只是要使用一个单一的全局实例,我现在会质疑完成课程的理由。要么使它成为“单例”类,要么在命名空间中使用自由函数。
答案 1 :(得分:2)
如果您需要单个全局实例,我建议您将ImageManager设为“Singleton”。 我不确定如何处理复杂类型,但是对于简单数据类型的全局声明,您应该在头文件中声明变量“extern”,并在一个模块(.cpp文件)中实例化它。