Я получаю неразрешенную ошибку внешнего символа в моей программе на 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;
}
Спасибо! Это был простой случай отказа от префикса Foo :: prefix от инициализатора. Ваше предложение «лучше еще» отлично работает на C++ 11, но на моем компиляторе C++ 03 необходимо изменить 'nullptr' на' 0' (но не 'NULL'). – sifferman