2013-08-18 49 views
0

這裏是類在C++中對析構函數錯誤的未定義引用?

class Email{ 
private: 
    char to[100]; 
    char from[100]; 
    char subject[200]; 
    char body[1000]; 

public: 
    Email(); 
    Email(char *za,char *od,char *tema, char *telo){ 
    strcpy(to,za); 
    strcpy(from,od); 
    strcpy(subject,tema); 
    strcpy(body,telo); 
    } 
    ~Email(); 
    void setTo(char *to) {strcpy(this->to,to);} 
    void setFrom(char *from) {strcpy(this->from,from);} 
    void setSubject(char *subject) {strcpy(this->subject,subject);} 
    void setBody (char *body) {strcpy(this->body,body);} 
    char* getTo() {return to;} 
    char* getFrom() {return from;} 
    char* getSubject() {return subject;} 
    char* getBody() {return body;} 
    void print() { 
    cout<<"To: "<<to<<endl<<"From: "<<from<<endl<<"Subject: "<<subject<<endl<<body; 
    } 
}; 

,正如你可以看到它包括析構函數。程序的其餘部分只是一個功能和主要部分。

int checkEmail(char *p){ 
int n=0,i=0; 
while(p[i]!='\0') 
{if(p[i]=='@') 
n++; 
i++;} 
if(n==1) 
    return 1; 
else return 0; 
    } 

int main() 
{ 
    char od[100],za[100],tema[200],telo[1000]; 
    cout<<"Za: "; 
    cin>>za; 
    if(checkEmail(za)){ 
    cout<<"Od: "; 
    cin>>od; 
    cout<<"Tema: "; 
    cin>>tema; 
    cout<<"Poraka: "; 
    cin>>telo; 
    Email o(od,za,tema,telo); 
    cout<<"Isprateno: "; 
    o.print(); 
} 
    else cout<<"Pogresna adresa!"; 
} 

它給出了一個錯誤

  1. OBJ \調試\ main.o ||在函數'主:|
  2. C:\ Users \ Stefan \ Desktop \ EMail \ main.cpp | 58 |對電子郵件::〜Email()'的未定義引用|
  3. C:\ Users \ Stefan \ Desktop \ EMail \ main.cpp | 58 |對電子郵件::〜Email()'的未定義引用|
  4. || ===構建完成:2個錯誤,0個警告(0分鐘,1秒)=== |

在包含o.print()的行中; 那它是什麼?也可以。告訴我如何突出顯示代碼中的一些行?

+0

你的析構函數'〜Email()'實現了哪裏? – P0W

回答

24

你聲明瞭析構函數;

~Email(); 

...但沒有定義它的身體。也許你的意思是;

~Email() { } 

...或者只是在沒有功能的情況下放棄它?

(你還缺少身體聲明默認構造函數)

+0

哦,我認爲它有效,無論有沒有這些括號,並且你是在說構造函數,但它在前面,所以它是一個析構函數。我知道我不必寫一個構造函數,如果我想使用編譯器提供的默認值,但它也提供了一個默認的析構函數,或者我必須寫〜電子郵件(){}以便按順序釋放釋放內存中的空間? – STEFS

+1

默認的構造函數和析構函數是免費的。在C++ 11中,這與「〜Email()= default;」一樣簡單。當你在這裏時,爲什麼不使用std :: string而不是固定長度的字符緩衝區來存儲課堂數據? – Sven

+0

哎呀,是的,在析構函數/構造函數措辭上的錯字。現在修復。 –

6

你必須定義你的析構函數,而不是申報。沒有可見的實現。做這樣的事情:

~Email() { 
//Whatever you want your destructor to take care of 
} 

如果你不想對你的析構函數做任何事情,那麼就不要聲明它。還要確保你爲你的構造函數做同樣的事情。看起來你也可能有同樣的問題。

+0

不會破壞整個對象,如果離開〜Email(){}; – STEFS

+1

是的。但是如果你沒有聲明它,就會隱式創建。如果您的班級爲自己分配了需要釋放資源的資源,您會申報一個。 – Iowa15