Вопрос об экземпляре определения класса - PullRequest
0 голосов
/ 01 июня 2011

У меня есть класс 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 ]

4 голосов
/ 01 июня 2011

Не создавайте экземпляры объектов в заголовках.

Создайте свой экземпляр объекта в одном исходном файле.

Если вам требуется доступ к нему через несколько единиц перевода,поместите это в свой заголовок:

extern imgmanager imagemgr; // declaration

Это сообщит всему коду, который может «видеть» заголовок, что существует так называемый объект;но на самом деле он будет определен только в одном исходном файле, в котором вы написали:

imgmanager imagemgr; // definition

(Это аналогично тому, как вы объявляете функции в заголовке, но определить их точно в одном исходном файле:

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

)


Приведенный выше общий совет, должным образом переданный, я бы сейчас поставил под сомнение в обосновании наличия класса ввсе, если вы собираетесь использовать только один единственный глобальный экземпляр.Либо сделайте его «одноэлементным» классом, либо используйте вместо него свободные функции в пространстве имен.

2 голосов
/ 01 июня 2011

Если вам требуется один глобальный экземпляр, я предлагаю вам сделать ImageManager «Singleton».Я не уверен, что делать со сложными типами, но для глобального объявления простого типа данных вы должны объявить переменную "extern" в заголовке и создать экземпляр именно в одном модуле (файл .cpp).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...