Как это делается по-человечески? Гугление не дало просветления. Как заставить линкер (MSVS) слинковать статическую библиотеку, содержащую реализацию синглетона, который потом референсится через интерфейсы асбтрактного базового класса? т.е. нет явного обращения к библиотеке (там только синглетон, все остальное физически в других модулях). Какие есть варианты? Спасибо!
А при чём здесь синглтон? Через интерфейс абстрактного класса можно работать только с виртуальными функциями и фабрикой(или без неё, если есть возможность создать конечный класс.).
Код (Text): class BaseAbstractSingleton { public: BaseAbstractSingleton* GetInstance( void ) const { return m_pDerivedSpecificSingleton; } virtual void foo() = 0; протектед: static BaseAbstractSingleton* m_pDerivedSpecificSingleton; } BaseAbstractSingleton::m_pDerivedSpecificSingleton = 0; BaseAbstractSingleton::BaseAbstractSingleton() { m_pDerivedSpecificSingleton = this; } ================= class SomeSingleton: public BaseAbstractSingleton { private: static SomeSingleton m_Object; } ================= void main() { BaseAbstractSingleton* tmp_ptr = BaseAbstractSingleton::GetInstance(); tmp_ptr->DoSomeObjectSpecificStuff(); } реализация SomeSingleton должна быть в отдельном файле/модуле и использоваться в виде статической библиотеки. если в проект просто добавить файл/модуль - то все прекрасно работает. А если сделать модуль отдельной статической библиотекой то BaseAbstractSingleton::GetInstance() возвращает (естественно) нуль. Поэтому вопрос, как заставить компилятор правильно включить библиотеку в программу? если это вообще возможно без блясок с бубном.
GetInstance не статическая, у SomeSingleton есть мембер себя-же. Очень интересно, как это у вас вообще работает?
GetInstance естественно статическая т.к. мы говорим о синглетоне. у меня не было намерения написать компилируемый код, а только лишь показать идею реализации на псевдокоде (хотя и это было не обязательно т.к. что такое синглетон и так понятно) =) - не понимаю сакрального смысла етой фразы =) работает все замечательно, в точности по книжке согласно паттерну синглетон. так что и этот вопрос мне тоже не понятен =) теперь мне бы очень желательно запихнуть реализацию конкретного синглетона в отдельную статическую библиотеку (.lib). гугл вежливо сообщил что таких желающих уже было (особенно под GCC), но ничего вразумительного о том как это сделать я не смог найти =(
Не обратил внимания что m_Object объявлен static-ом, а значит он и не мембер. Для студии похоже достаточно инициализировать SomeSingleton::m_Object;
наверное имелось ввиду определение объекта. да, его достаточно, если файл включен в общее дерево и не достаточно если реализация помещается в статическую библиотеку - в этом случае линковщик не видит явных обращений к библиотеке/классу и не линкует с проектом =(
У меня 2010 студия линкует. Можно ещё сделать static volatile SomeSingleton m_Object;, хотя не думаю что это критично.