2015-12-05 2 views
1

Я получаю неразрешенную ошибку внешнего символа в моей программе на C++. Я предоставил MCVE ниже.C++ Unresolved External on Singleton с перегруженной функцией доступа

Для конструктора класса Foo требуется один параметр int. Я хочу, чтобы Foo был одиночным объектом.

В классе Foo я создал две функции доступа для получения указателя на объект singleton. Первый передает параметр int, чтобы разрешить создание объекта. Второй не требует параметра, чтобы позволить объекту получить доступ к коду, который не знает этого параметра.

Ошибка возникает во время соединения при попытке создания экземпляра Foo в пределах main().

Есть ли лучший способ сделать это, самое главное, чтобы избежать ошибки и (что менее важно), поэтому интерфейс Foo не налагает неудачное требование, чтобы второй аксессор не мог быть вызван до первого?

#include <assert.h> 

class Foo { 
public: 
    // Accessor function initializes m_param, and 
    // returns pointer to singleton. 
    static Foo* GetInstance (int *param) 
    { 
     // Foo singleton object is instantiated on first call 
     // to this function 
     static Foo instance (param); 
     pInstance = &instance; 
     return pInstance; 
    } 

    // Overloaded version of GetInstance() that may be called 
    // after first calling static Foo* GetInstance(int *param). 
    static Foo* GetInstance() 
    { 
     // This alerts us if the other GetInstance() was not called first. 
     assert (pInstance); 

     return pInstance; 
    } 

private: 
    // constructor 
    Foo (int *param) 
     : m_param (*param) 
    {} 

    // private var 
    int m_param; 

    // pointer to singleton object 
    static Foo* pInstance; 
}; 

// initialize static var 
Foo* pInstance = static_cast<Foo*>(nullptr); 


int main(int argc, char* argv[]) 
{ 
    int pInt; 
    Foo* pFoo = Foo::GetInstance (&pInt); 
    return 0; 
} 

ответ

1

Чтобы исправить ошибку связи, изменить

Foo* pInstance = static_cast<Foo*>(nullptr); 

к

Foo* Foo::pInstance = static_cast<Foo*>(nullptr); 

или еще лучше:

Foo* Foo::pInstance = nullptr; 

Проверить this ссылку из объяснений углубленного

See this для подробного обсуждения наилучшего способа использования Singleton Выкройка:

+0

Спасибо! Это был простой случай отказа от префикса Foo :: prefix от инициализатора. Ваше предложение «лучше еще» отлично работает на C++ 11, но на моем компиляторе C++ 03 необходимо изменить 'nullptr' на' 0' (но не 'NULL'). – sifferman