1
我在C++程序中遇到無法解析的外部符號錯誤。我在下面提供了一個MCVE。C++未解析外部Singleton具有重載訪問器函數
Foo
類的構造函數需要單個參數int
。我想Foo
是一個單身人士的對象。
在Foo
類中,我創建了兩個訪問器函數來檢索指向單例對象的指針。第一個傳遞參數int
以允許構建該對象。第二個不需要該參數,以便允許通過不知道該參數的代碼訪問該對象。
嘗試在main()
內創建Foo
實例時,鏈接時發生錯誤。
有沒有更好的方法來做到這一點,最重要的是爲了避免錯誤,(不太重要),所以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 ::前綴。你的「更好的」建議在C++ 11上可以正常工作,但在我的C++ 03編譯器中,需要將'nullptr'改爲'0'(但不是'NULL')。 – sifferman