2015-12-07 4 views
0

У меня есть одноэлементный класс.multi file access to singleton class

В хиджры

class single 
{ 
    public: 
     static single *Instance; 
     static single* getInstance() 
     { if(!Instance) Instance = new single; 
      return Instance; 
     } 
     void hello() { cout<<"Hello"; } 
    private: single(){ } 
} 

В a.cpp

single *single::Instance = 0; 
std::auto_ptr <single> SINGLE_OBJ (single::getInstance()); 

В B.cpp

#include "A.h" 

SINGLE_OBJ->hello(); 

Я получаю следующее сообщение об ошибке: SINGLE_OBJ не был объявлен в этой области.

+1

Почему бы вам не использовать единый :: GetInstance() -> привет(); в B.cpp? – Rabbid76

+0

Почему память экземпляра управляется извне через 'auto_ptr'? Тот факт, что он выделяется с помощью 'new', является деталью реализации. Он должен быть внутренним для 'single' для инкапсуляции и для обеспечения очистки памяти, даже если пользователь не поместил указатель в' auto_ptr'. Кстати, C++ 11 заменяет устаревший шаблон класса std :: auto_ptr' на 'std :: unique_ptr'. – TheOperator

ответ

1

Чтобы сделать SINGLE_OBJ видимым в B.cpp, вы должны объявить его в A.h. То есть:

extern std::auto_ptr <single> SINGLE_OBJ; 

также, почему вы используете std::auto_ptr, его не рекомендуется - вы должны перейти на std::unique_ptr

+0

Это сработало, когда я скомпилировал код и создал «.o» и «.so» успешно. Но когда другое приложение пытается использовать это «.o» или «.so», я получаю сообщение об ошибке, которое указывает Undefined ссылку на SINGLE_OBJ – user2524261

+0

@ user2524261, возможно, вы захотите начать новый вопрос, вы не упомянули, что хотите использовать его в общих библиотека. Для меня это звучит как некорректная команда в компиляции, т.е. смотрите здесь: http://stackoverflow.com/questions/12748837/c-shared-library-undefined-reference-to-fooclasssayhello – marcinj

 Смежные вопросы

  • Нет связанных вопросов^_^