Синглетон в отдельном модуле

Тема в разделе "LANGS.C", создана пользователем NeuronViking, 4 янв 2011.

  1. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    Как это делается по-человечески? Гугление не дало просветления.
    Как заставить линкер (MSVS) слинковать статическую библиотеку, содержащую реализацию синглетона, который потом референсится через интерфейсы асбтрактного базового класса? т.е. нет явного обращения к библиотеке (там только синглетон, все остальное физически в других модулях).
    Какие есть варианты?
    Спасибо!
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А при чём здесь синглтон? Через интерфейс абстрактного класса можно работать только с виртуальными функциями и фабрикой(или без неё, если есть возможность создать конечный класс.).
     
  3. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    Код (Text):
    1. class BaseAbstractSingleton {
    2.     public:
    3.        BaseAbstractSingleton* GetInstance( void ) const {
    4.                  return m_pDerivedSpecificSingleton;
    5.        }
    6.  
    7.        virtual void foo() = 0;
    8.  
    9.      протектед:
    10.    
    11.        static BaseAbstractSingleton* m_pDerivedSpecificSingleton;
    12. }
    13.  
    14. BaseAbstractSingleton::m_pDerivedSpecificSingleton = 0;
    15.  
    16. BaseAbstractSingleton::BaseAbstractSingleton() {
    17.         m_pDerivedSpecificSingleton = this;
    18. }
    19.  
    20. =================
    21.  
    22. class SomeSingleton: public BaseAbstractSingleton {
    23.         private:
    24.              static SomeSingleton m_Object;
    25. }
    26.  
    27. =================
    28.  
    29. void main() {
    30.        
    31.        BaseAbstractSingleton* tmp_ptr = BaseAbstractSingleton::GetInstance();
    32.  
    33.        tmp_ptr->DoSomeObjectSpecificStuff();
    34.  
    35. }
    реализация SomeSingleton должна быть в отдельном файле/модуле и использоваться в виде статической библиотеки. если в проект просто добавить файл/модуль - то все прекрасно работает. А если сделать модуль отдельной статической библиотекой то BaseAbstractSingleton::GetInstance() возвращает (естественно) нуль. Поэтому вопрос, как заставить компилятор правильно включить библиотеку в программу? если это вообще возможно без блясок с бубном.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GetInstance не статическая, у SomeSingleton есть мембер себя-же. Очень интересно, как это у вас вообще работает?
     
  5. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    GetInstance естественно статическая т.к. мы говорим о синглетоне. у меня не было намерения написать компилируемый код, а только лишь показать идею реализации на псевдокоде (хотя и это было не обязательно т.к. что такое синглетон и так понятно) =)

    - не понимаю сакрального смысла етой фразы =)
    работает все замечательно, в точности по книжке согласно паттерну синглетон. так что и этот вопрос мне тоже не понятен =)

    теперь мне бы очень желательно запихнуть реализацию конкретного синглетона в отдельную статическую библиотеку (.lib). гугл вежливо сообщил что таких желающих уже было (особенно под GCC), но ничего вразумительного о том как это сделать я не смог найти =(
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Не обратил внимания что m_Object объявлен static-ом, а значит он и не мембер.

    Для студии похоже достаточно инициализировать SomeSingleton::m_Object;
     
  7. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    наверное имелось ввиду определение объекта. да, его достаточно, если файл включен в общее дерево и не достаточно если реализация помещается в статическую библиотеку - в этом случае линковщик не видит явных обращений к библиотеке/классу и не линкует с проектом =(
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    У меня 2010 студия линкует. Можно ещё сделать static volatile SomeSingleton m_Object;, хотя не думаю что это критично.