2012-07-26 35 views
1

我不知道爲什麼發生這種情況時,我跟着例如貼here.未定義的符號錯誤調用辛格爾頓的getInstance()

class Song { 

private: 
    // singletong 
    Song(); 
    Song(Song const&); // don't implement 
    void operator = (Song const&); //don't implement 

public: 
    // Singleton method 
    static Song &getInstance(){ 
     static Song song; 
     return song; 
    } 

}; 

如果我不調用類的,沒有任何問題。只要我這樣稱呼Song類:

Song::getInstance(); 
// also tried: Song &song = Song::getInstance(); 

Xcode不想再構建項目。我得到這個錯誤: enter image description here

任何想法爲什麼發生這種情況?

+1

'宋'是單身?你只需要一首歌?你不喜歡音樂或什麼? ;-) – Nawaz 2012-07-26 15:07:08

回答

8

你不執行具有中自getInstance()函數實例化對象存在的構造函數:

static Song song; 

要麼實現它內聯(unprefered):

private: 
    // singletong 
    Song() { 
     // Your implementation goes here 
    } 

或者在實現它編譯單元(例如Sound.cpp)(首選):

Song::Song(){ 
    // Your implementation goes here 
} 
+0

或讓編譯器實現它:) – 2012-07-27 11:26:52

1

要麼

  • 您沒有實現默認構造函數 - 只需將Song();替換爲Song() {}以查看這是否是原因。
  • 您正在通過致電Song s = Song::getInstance()而不是Song& s = Song::getInstance()來創建副本。
2

您尚未提供默認構造函數的實現。這就是爲什麼你得到一個未定義的參考。

這是一個鏈接錯誤,而不是編譯器錯誤。這意味着你的代碼已經實際編譯正確。編譯之後,鏈接器將您的編譯目標代碼和「鏈接」在一起,形成一個可執行文件。如果你的所有函數都不存在,就像你聲明的那樣,鏈接器就會變得瘋狂(這在動態鏈接的情況下並不嚴格,但這是另一個問題)。

但是,許多編譯器不會浪費時間嘗試鏈接從未在代碼中調用過的函數。

在你的情況下,當你不調用函數時,你不會得到這個錯誤,因爲你的getInstance()永遠不會嘗試構造一個對象,因爲它沒有被調用。