C ++ Singleton Реализация - проблемы со статическим - PullRequest
1 голос
/ 27 июня 2011

Прошло много времени с тех пор, как я программировал на C ++.Я пытался реализовать одноэлементный класс, но я получил неразрешенный внешний символ.Ребята, можете ли вы указать на решение этой проблемы?Заранее спасибо!

class Singleton
{
    Singleton(){}
    Singleton(const Singleton & o){}
    static Singleton * theInstance;

public:
    static Singleton getInstance()
    {
        if(!theInstance)
            Singleton::theInstance = new Singleton();

        return * theInstance;
    }
};

Ошибки:

Ошибка 3, ошибка LNK1120: 1 неразрешенная внешняя информация

Ошибка 2, ошибка LNK2001: неразрешенная внешняя символика "private: static class Singleton * Singleton::theInstance" (?theInstance@Singleton@@0PAV1@A)

Ответы [ 3 ]

9 голосов
/ 27 июня 2011

У вас есть объявленный Singleton::theInstance, но вы не определили его.Добавьте его определение в некоторый файл .cpp:

Singleton* Singleton::theInstance;

(также Singleton::getInstance должно возвращать Singleton&, а не Singleton.)

4 голосов
/ 27 июня 2011

Необходимо предоставить определение theInstance вне объявления класса, в файле реализации C ++:

Singleton *Singleton::theInstance;
2 голосов
/ 27 июня 2011

В качестве альтернативы всем остальным ответам вы можете просто покончить с закрытым членом и использовать переменную функции static-scope:

static Singleton getInstance()
{
   static Singleton * theInstance = new Singleton(); // only initialized once!
   return *theInstance;
 }
...