2016-02-08 6 views
0

Я пытаюсь получить первый базовый пример синглтона от Design Patterns , но это меня озадачило.Неопределенная ссылка на Singleton :: Singleton()

Этот код компилируется с g++ -c Singleton.cpp:

class Singleton { 
public: 
    static Singleton* Instance(); 
protected: 
    Singleton(); 
private: 
    static Singleton* _instance; 
}; 

Singleton* Singleton::_instance = 0; 

Singleton* Singleton::Instance() { 
    if (_instance == 0) { 
     _instance = new Singleton; 
    } 
    return _instance; 
} 

Но когда я добавляю скелетную основной() и компилировать с g++ Singleton.cpp я undefined reference to 'Singleton::Singleton()'.

Что мне не хватает?

+0

Вы объявили конструктор (вам это не нужно), но он оставил его определение. –

+0

@ DieterLücking _ «вам не нужно» _ Это не совсем так. По крайней мере, это должно быть сделано «частным». –

+0

@ πάνταῥεῖ конечно - проклятый антифокус –

ответ

4

Вы никогда не добавил определение для

Singleton(); 

, который используется в Singleton* Singleton::Instance() по

_instance = new Singleton; 

Как правило, вы должны и могут макет синглтона как:

class Singleton { 
public: 
    static Singleton* Instance() { static Singleton s; return &s; } 
    Singleton(const Singleton&) = delete; 
    void operator=(const Singleton&) = delete; 
private: 
    Singleton() = default; 
}; 
+0

Отличный ответ, я обязательно буду использовать этот фрагмент. Но это немного отличается от примера учебника, возможно, вы могли бы добавить немного об использовании конструктора по умолчанию? – Daniel

+1

@ Daniel 'Singleton() = default;' в основном просто способ C++ 11 для написания 'Singleton() {}'. Если заставляет компиляцию генерировать 'Singleton() {}'; – NathanOliver

+0

Спасибо, Натан! Что означает '= delete'? Является ли это синтаксическим сахаром? – Tim

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