2013-02-22 94 views
1

當我編譯下面的C++代碼:C++中對象實例化的語法是什麼?

#include "ConstantList.h" 

using namespace std; 

int main() { 

ConstantList* cl = new ConstantList(); 

//do something with cl 

delete cl; 
cl = NULL; 

return 0; 
} 

編譯器給我的錯誤:

Undefined symbols: 
    "ConstantList::~ConstantList()", referenced from: 
     _main in ccNfeeDU.o 
    "ConstantList::ConstantList()", referenced from: 
     _main in ccNfeeDU.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

我沒有獲得用於實例化對象的語法對不對? 我ConstantList.h文件看起來像這樣:

#ifndef ConstantList_h 
#define ConstantList_h 

#include <string> 
#include "Token.h" 


using namespace std; 

class ConstantListTail; 

class ConstantList { 
public: 
    ConstantList(); 
    ~ConstantList(); 

    std::string toString(); 

    void push_back(Token*); 
    void push_back(ConstantListTail*); 

private: 
    Token* termString; 
    ConstantListTail* constantListTail; 
}; 



#endif 

任何幫助,不勝感激!

+0

[「在G ++ Cpp中未定義的引用」的可能重複(http://stackoverflow.com/questions/6978241/undefined-reference-to-in-g-cpp) – 2013-02-22 17:40:33

回答

5

你的語法是正確的,因爲你得到一個鏈接器錯誤,而不是編譯器錯誤。這個錯誤意味着你正在編譯您main沒有ConstantList.cpp的來源,或不以ConstantList.o

參考使用該命令編譯鏈接應該修復錯誤:

g++ collect2.cpp ConstantList.cpp 

(我假設的文件您的main功能稱爲collect2.cpp)。

+0

謝謝 - 最初我編譯我的整個項目(72 .cpp和.h文件)與g ++ * .cpp。沒有編譯器錯誤。然後我試着運行它。所有它給了我一個Mac上的「總線錯誤」和Linux上的「無法執行二進制文件」。我研究過,有人認爲這是由於無效的內存訪問。所以我開始把我所有的指針都仔細研究。經過一些故障排除後,我試着獨立編譯每個文件,看看我的指針語法是否正確。不確定是否指針語法或對象實例化或其他原因導致該問題。再次感謝你的幫助! – ejsuncy 2013-02-22 19:05:50

2

「未定義的符號」是指已聲明的標識符(在這種情況下,析構函數),它的使用,但只要鏈接器知道你有沒有定義

定義添加的地方,並確保編譯後的版本在文件中的一個鏈接鏈接


重「語法實例化」,不幸的是,在沒有專門的語法C++

代替功能轉換符號用於構造函數調用

也許你到了一個純粹的語法實例最接近的是在頭文件中new表達


重新

using namespace std; 

。例如,

標準庫定義了一種叫做distance的東西。包含頭部的某些代碼將擁有自己的distance並得到名稱衝突的可能性有多大?遠高於零。

這並不意味着你不應該在頭文件中有using namespace std;,但你永遠不應該在頭文件的全局名稱空間中擁有它。對於其他名稱空間,要非常瞭解它的功能,即提供所有標準庫名稱作爲該名稱空間的一部分。

+0

提及'使用命名空間'的+1 +1 – Arpit 2013-02-22 17:34:29

+0

謝謝!我正在學習來自java背景的C++。我很拼命地試圖讓這個代碼只是編譯,並用命名空間進行了故障排除。我忘了從頭文件中刪除它。 – ejsuncy 2013-02-22 19:00:41