C++ 类定义实例实例化问题

C++ 类定义实例实例化问题,c++,C++,我有一个类imgmanager,它允许我只加载一次我的所有图像,这非常好,虽然原型制作时我将所有文件放在一个地方,所以我不必担心循环定义。然而,在把我所有的课程分开之后,我遇到了一个问题 我的头文件 #ifndef IMAGEMANAGER_H #define IMAGEMANAGER_H #include "Img.h" #include <vector> #include <map> #include <string> class imgmanag

我有一个类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
\ifndef IMAGEMANAGER\u H
#定义图像管理器
#包括“Img.h”
#包括
#包括
#包括
类imgmanager{
受保护的:
矢量图像;
地图位置;
公众:
sf::Image*addimg(std::string path);//相对于资源
sf::Image*getimg(std::string路径);
int size();
虚拟~imgmanager();
sf::Image*运算符[](int);
}图像管理器;
#恩迪夫
在}之后和之前创建的实例;我的编译器向我抱怨:

所以我问:我应该怎么做才能拥有imagemgr类的全局实例?我应该创建一个全局头文件并创建一个实例吗?(在这种特殊情况下,我可以在main.cpp中创建一个全局变量,所有的头都不需要实例)


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

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

不要在标头中创建对象实例

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

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

extern imgmanager imagemgr; // declaration
这将通知所有能够“看到”标题的代码存在一个所谓的命名对象;但它实际上仍将仅在您编写的一个源文件中定义:

imgmanager imagemgr; // definition
(这类似于在头文件中声明函数的方式,但只在一个源文件中定义它们:

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



上面的一般性建议尽职尽责地传授给大家,如果你只打算使用一个单一的全局实例,那么我现在就质疑拥有一个类的理由。要么将其设置为“单例”类,要么在名称空间中使用自由函数。

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

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

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

extern imgmanager imagemgr; // declaration
这将通知所有能够“看到”标题的代码存在一个所谓的命名对象;但它实际上仍将仅在您编写的一个源文件中定义:

imgmanager imagemgr; // definition
(这类似于在头文件中声明函数的方式,但只在一个源文件中定义它们:

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



上面的一般性建议尽职尽责地传授给大家,如果你只打算使用一个单一的全局实例,那么我现在就质疑拥有一个类的理由。要么让它成为一个“单例”类,要么在命名空间中使用自由函数。

这其中的哪一部分特定于Windows,或者特定于Code::Blocks?这其中的哪一部分特定于Windows,或者特定于Code::Blocks?Tomalak,我对你的最后一段提出疑问。首先,Singleton是一个类,所以“您不需要类-使用Singleton”听起来很奇怪。至于使用免费函数,图像管理器应该维护的所有数据是什么?它导致使用静态变量。我不确定静态变量和自由函数是否比singletonWell更好。谢谢你,Tomalak,这实际上非常清楚地说明了我所预期的情况(不知道实现情况)@davka:我说我质疑拥有一个类的理由。我也会质疑使用单例的理由,是的,它仍然是一个类。但这至少是摆脱这种状况的一个中途之家托马拉克,我对你的最后一段提出质疑。首先,Singleton是一个类,所以“您不需要类-使用Singleton”听起来很奇怪。至于使用免费函数,图像管理器应该维护的所有数据是什么?它导致使用静态变量。我不确定静态变量和自由函数是否比singletonWell更好。谢谢你,Tomalak,这实际上非常清楚地说明了我所预期的情况(不知道实现情况)@davka:我说我质疑拥有一个类的理由。我也会质疑使用单例的理由,是的,它仍然是一个类。但这至少是摆脱这种状况的一个中途之家正如我的期望,我并非毫无疑问。
extern
适用于任何类型。正如我的期望,我并非毫无疑问。
extern
适用于任何类型。