类定义实例实例化问题

时间:2011-06-01 14:29:26

标签: c++

我有一个类 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中创建一个全局变量,没有一个头需要实例)

Problem Screencap

2 个答案:

答案 0 :(得分:4)

不要在标题中创建对象实例。

一个源文件中创建对象实例。

如果您需要跨多个翻译单元访问它,请将其放在标题中:

extern imgmanager imagemgr; // declaration

这将通知所有可以“看到”标题的代码,这些代码存在一个如此命名的对象;但它仍然只会在您编写的一个源文件中实际定义:

imgmanager imagemgr; // definition

(这类似于在标头中声明函数的方式,但在恰好一个源文件中定义

void f(); // declaration
void f() { ... } // definition


上面提到的一般性建议,如果你只是要使用一个单一的全局实例,我现在会质疑完成课程的理由。要么使它成为“单例”类,要么在命名空间中使用自由函数。

答案 1 :(得分:2)

如果您需要单个全局实例,我建议您将ImageManager设为“Singleton”。 我不确定如何处理复杂类型,但是对于简单数据类型的全局声明,您应该在头文件中声明变量“extern”,并在一个模块(.cpp文件)中实例化它。