2011-02-28 51 views
0

我試圖編譯在Xcode一些C++代碼C++代碼,我得到這個錯誤:問題時,在Xcode

Undefined symbols: 
    "Editorial::sm_nTotalEditorials", referenced from: 
     Editorial::AskTotal()  in editorial.o 
     Editorial::~Editorial()in editorial.o 
     Editorial::~Editorial()in editorial.o 

名單如下與析構函數兩個條目和四個條目的構造(我認爲這是我使用sm_nTotallecteds的唯一功能)。我附加了變量的定義和我使用它的功能。

class Editorial 
{ 
private: 
    static int   sm_nTotalEditorials; 
    ... 
} 

int Editorial::AskTotal() {return sm_nTotalEditorials;} 

Editorial::~Editorial() 
{ 
    if (!m_pPrev) sm_pFirstEditorial=m_pNext; 
    if (m_pPrev) (*m_pPrev).SetContext((*m_pPrev).AskPrev(),m_pNext); 
    if (m_pNext) (*m_pNext).SetContext(m_pPrev,(*m_pNext).AskNext()); 
    sm_nTotalEditorials--; 
} 

然後它打印出與我使用的其他3個靜態私有變量類似的錯誤。我必須將靜態用法搞亂。這是我的第一個C++代碼,所以我對任何不好的語法表示歉意,或者如果問題太愚蠢,我試圖搜索互聯網,但Xcode打印的錯誤是相當含糊不清的,根據我見過的教程,我使用所有應用程序。此外,打印所有代碼的代碼很長,我粘貼了我認爲應該出錯的部分,但是我也不確定。

+0

你的源代碼有什麼結局? .m或.cpp? – hol 2011-02-28 21:00:22

+0

我不知道這是否有幫助。但我記得我試圖編譯一些C代碼,當我將.c的結尾改爲.m時,它突然編譯。也許不是你的問題只是一個想法。 – hol 2011-02-28 21:07:23

回答

1

在C++中,爲類創建一個靜態數據成員是一個兩步過程。首先,你必須聲明你在這裏完成的變量。但是,您還必須在某處定義它,以便編譯器知道將變量的存儲空間放在哪裏。通常,這是在類的.cpp文件中完成的。在.cpp文件,嘗試加入這一行:

int Editorial::sm_nTotalEditorials = 0; 

這使編譯器,它需要的定義,所以你不會得到任何更多的鏈接錯誤抱怨缺少的定義。您也可能想爲其他靜態數據成員執行此操作。

請注意,在進行這些類型的定義時,不要重複static關鍵字;這會給靜態字段靜態鏈接,這不會解決問題。

+0

謝謝!有效!奇怪的是,在我正在閱讀的教程中(總體來說非常好...除此之外)它明確表示靜態變量初始化爲0,當您不說明其他任何內容時... – Nordico 2011-02-28 21:14:20

+0

@ Nordico- this是真的,但這是誤導。如果你定義了一個靜態變量並且保持未初始化,那麼它默認爲零,但是你仍然需要在某個地方定義它。這是缺乏導致你的問題的定義。 – templatetypedef 2011-02-28 21:16:42

+0

如何在不初始化值的情況下提供完整的定義?只要「int Editorial :: sm_nTotallecteds」就足夠了,或者有另一種方式? (對不起,因爲討厭,但教程沒有澄清這個靜態變量的差異,我想完全理解它) – Nordico 2011-02-28 21:33:48

0

它編譯爲C++代碼嗎?我記得讀過這個文件需要一個.mm擴展名來區分它和obj-c。 Xcode中的文件的「獲取信息」頁面上還有一個文件類型下拉菜單。