2016-10-21 2 views
0

я вижу ошибки какОшибка в реализации шаблона Singleton

ЦСИ/singleton.cxx: 16: ошибка: неправильное использование элемента 'Singleton :: например' в статической функции члена SRC/singleton.cxx: 28: ошибка : из этого местоположения src/singleton.cxx: 16: ошибка: недопустимое использование элемента 'Singleton :: instance' в статической функции-члене src/singleton.cxx: 29: ошибка: из этого места src/singleton.cxx: 16: ошибка: недопустимое использование элемента «Singleton :: instance» в статической функции-члене src/singleton.cxx: 31: ошибка: из этого места src/singleton.cxx: В функции 'int main()':

Теперь после внесения изменений я получаю следующие ошибки

синглтон-rhel6.3.o: В функции Singleton::get_instance()': src/singleton.cxx:27: undefined reference to Singleton :: например»

#include <cstddef> 

class Singleton { 

private: 
    Singleton(); 
    static Singleton * instance; 
    int m_num; 
    int incr_call(); 

public : 
    static Singleton * get_instance(); 

}; 

Singleton * Singleton::get_instance() { 
    if(instance == NULL) 
    instance = new Singleton(); 
    return instance; 
} 

Singleton::Singleton(): 
    m_num(0) 
{ 
} 

int Singleton::incr_call() { 
    return m_num++; 
} 

int main() { 
    Singleton * s = Singleton::get_instance(); 
    return 0; 
} 
+1

не проблема, но Singleton * экземпляр ';' не должно быть публичным – NathanOliver

+1

экземпляр должен быть статичным. Хотя, возможно, вы захотите рассмотреть возможность реализации этого проекта Bjarne Stroustrup. – drescherjm

+1

Прочитайте статические функции-члены. – juanchopanza

ответ

1

instance должен быть static, так как вы хотите, чтобы иметь возможность позвоните по телефону get_instance. Кроме того, instance должен быть private:

class Singleton { 

public : 
    static Singleton * get_instance(); 


private: 
    Singleton(); 
    static Singleton * instance; 
    int m_num; 
    int incr_call(); 

}; 
Singleton* Singleton::instance; 

Вы должны изменить свой конструктор тоже не инициализировать instance:

Singleton::Singleton(): 
    m_num(0) 
{ } 

Поскольку instance является static инициализация по умолчанию выполняется, и это будет NULL/nullptr.

+0

Я сделал эти изменения, и он все еще жалуется, когда экземпляр сравнивается с NULL. –

+0

Возможно, вы забыли «Singleton * Singleton :: instance;' – drescherjm

1

Если вы должны использовать синглтон, используйте Мейерс один:

class Singleton { 
private: 
    Singleton() = default; 
    Singleton(const Singleton&) = delete; 
    Singleton& operator=(const Singleton&) = delete; 

public : 
    static Singleton& get_instance() 
    { 
     static Singleton instance; 
     return instance; 
    } 

// Extra stuff 
}; 
+0

. Я не понимаю этого. Я прочитал концепцию синглтона, увидел несколько примеров и попытался его реализовать. что делают мейеры, которые исправляют проблему, возникающую у меня? –

+0

Этот код проще, чем ваш, и позволяет избежать статического порядка инициализации fiasco https://isocpp.org/wiki/faq/ctors#static-init-order – drescherjm

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