Я пишу библиотеку служебных классов, многие из которых являются синглетонами. Я реализовал их как таковые, используя наследование:
template <class T>
class Singleton {
public:
T& getInstance() {
if(m_instance == 0) {
m_instance = new T;
}
return m_instance;
}
private:
static T* m_instance;
};
class SomeClass : public Singleton<SomeClass> {
public:
SomeClass() {}
virtual ~SomeClass() {}
void doSomething() {;}
};
Очевидно, что это простой пример, а не реальный класс. В любом случае, я обнаружил, что с помощью кода, такого как:
SomeClass::getInstance().doSomething();
Будет создано более одного экземпляра SomeClass. Я думаю, что это может быть связано с тем, что он используется вне моего файла библиотеки (.a), а также внутри. Например, я использую библиотеку пользовательского интерфейса, не написанную мной, которая отдельно компилируется и к которой я делаю дополнения. Некоторые из этих дополнений используют синглтоны, которые также используются в моей библиотеке .a.
Вызывает ли это отдельный сборник? Что-то еще?
Единственный способ, которым мне удалось обойти эту проблему, - это создать глобальный объект в моем файле main.cpp, который я инициализирую любыми синглетами, которые мне понадобятся. Затем весь код обращается к этому общему глобальному объекту с помощью вызовов, таких как:
GlobalObject::getSomeClass().doSomething()
Ненавижу добавлять дополнительные методы к этому объекту каждый раз, когда создаю еще один синглтон. Плюс синтаксис кажется более понятным и более знакомым при использовании первого метода доступа:
SomeClass::getInstance().doSomething();
Пожалуйста, дайте мне знать, если у вас есть какие-либо мысли, мнения и т. Д.
Спасибо.