2012-04-30 61 views
0

我創建了我的頭文件的類和#included在main.cpp「theclassname.h」但當我嘗試編譯我得到「未定義引用」ClassName :: TheConstructor(bool,int * ,std :: basic_string,std :: allocator>)「」與主C++類的問題

我在我的Classname.cpp文件中編寫了構造函數和一個名爲「ClassName :: start」的函數,但由於某種原因,它給了這個未定義的引用問題對於這個開始函數和我的析構函數,它也被編碼在我的cpp文件中。我在main函數中調用的每個函數都是在頭文件中編寫的函數,但不會觸發此錯誤,但每次調用編譯到我的.cpp文件中的函數時都會觸發此函數。

我見過很多關於此的帖子,但是我已經用正確的參數和返回類型正確地編碼了它們,並確保函數名稱與頭文件中定義的名稱相同。除了拼寫錯誤之外,還有什麼可能導致這種情況,因爲我已經檢查了超過10次。

感謝

#ifndef THECLASSNAME_H 
#define THECLASSNAME_H 
#include <iostream> 

class TheClassName { 
public: 
    TheClassName(bool theBool=true, int *theArray=0, 
     std::string message="-1"); 
~TheClassName(); 
void start(); 
void setBool(bool theBool) {aBool=theBool;} 
bool getBool() {return aBool;} 
void setMessage(std::string message) {mssg=message;} 
std::string getMessage() {return mssg;} 
std::string getHello() {return hello;} 
private: 
int *anArray; 
bool aBool; 
std::string mssg; 
std::string hello; 

void aFunction1(bool); 
void aFunction2(); 
void aFunction3(); 

void aFunction4(); 
}; 

#endif 

對不起大家只是定了!在我的makefile我做

exec1: main.o classname.o 
    g++ -o exec1 main.o 

而不是

exec1: main.o classname.o 
    g++ -o exec1 main.o classname.o 

謝謝你們這麼多!

+4

而不是試圖描述你的代碼,你應該發佈你的代碼(或者至少是你的代碼的簡化代表版本)。 –

+0

聽起來像.cpp文件不是你的項目的一部分。如果將它添加到項目中,編譯器和鏈接器將查找函數定義。 – tmpearce

+0

我想你應該改編/編輯你以前的問題(http://stackoverflow.com/questions/10386144/constructor-parameter-issue-c) –

回答

2

這聽起來像你在鏈接器階段得到的錯誤。你是否也在編譯你有C++類定義的文件,而不只是包含頭文件?您需要爲您的類使用函數定義的單獨C++文件,編譯此文件,並在鏈接器命令行中包含目標文件,以便在鏈接最終可執行文件時不會出現未定義的引用錯誤。

+0

從技術上講,你不需要一個單獨的文件,但你絕對應該。 – chris

+0

是的。我只是想灌輸一些良好的做法:) –

+0

在我的生成文件中,我有 – JDN

1

如果可能,請發佈您的代碼併發布構建命令和輸出。

這是一個鏈接而不是編譯問題,聽起來像包含構造函數和析構函數聲明的編譯單元沒有鏈接到可執行文件 - 換句話說,鏈接程序找不到您的函數。