2015-12-05 27 views
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; 
} 

回答

1

要修復鏈接錯誤,請更改

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

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

或更好:

Foo* Foo::pInstance = nullptr; 

檢查this鏈接了一個深入的解釋

See this深入討論關於使用Singleton模式的最佳方法:

+0

謝謝!這是一個簡單的例子,在初始化器中省略了Foo ::前綴。你的「更好的」建議在C++ 11上可以正常工作,但在我的C++ 03編譯器中,需要將'nullptr'改爲'0'(但不是'NULL')。 – sifferman