C++中的析构函数未定义错误是什么?

10
这里是该类的定义。
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\Debug\main.o||在函数 `main' 中:
  2. C:\Users\Stefan\Desktop\EMail\main.cpp|58|未定义对 `Email::~Email()' 的引用
  3. C:\Users\Stefan\Desktop\EMail\main.cpp|58|未定义对 `Email::~Email()' 的引用
  4. ||=== 构建完成:2 个错误,0 个警告(已用时 0 分钟,1 秒钟) ===|

问题出现在包含 o.print() 的那一行。另外,有人可以告诉我如何在我的代码中突出显示某些行吗?


你的析构函数~Email()在哪里实现了? - P0W
2个回答

45

你正在声明一个析构函数;

~Email();

...但没有为它定义主体内容。也许您的意思是:

~Email() { }

是否应该删除没有功能的代码或者干脆不写它?

(您的默认构造函数也缺少主体声明)


哦,我以为它可以两种方式工作,有或没有那些括号。你说构造函数,但是前面有个 ~ ,所以这是一个析构函数。我知道我不必写构造函数,如果需要的话,我可以使用编译器提供的默认构造函数,但是是否也会提供默认析构函数,或者我必须编写 ~Email() {} 以释放内存中的空间? - Stefan Stojkovski
1
默认构造函数和析构函数是免费的。在C++11中,这很容易实现,只需使用“~Email()=default;”。顺便说一下,为什么不使用std::string代替固定长度的char缓冲区来处理类内数据呢? - Sven
糟糕,是的,在析构函数/构造函数措辞上有笔误。现在已经修复了。 - Joachim Isaksson
你能告诉我需要做哪些更改才能使用std:string吗?据我所知,如果我进行更改,我的程序会崩溃。 - Stefan Stojkovski
@StefanStojkovski 将所有的char*更改为std::string,并使用常规的=代替strcpy,这应该可以让您开始工作。为了优化,尽可能使用const std::string&而不是普通的std::string作为参数传递,但这是次要的,因为两者在大多数情况下都可以工作。如果您有其他特定问题,也许您可以发起一个新的问题,这往往会引起调试专家的更多关注 :) - Joachim Isaksson
显示剩余2条评论

6

您需要定义析构函数,而不仅仅是声明。没有可见的实现。可以像这样做:

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

如果你不想在析构函数中做任何事情,那就根本不要声明它。同样地,请确保您的构造函数也是如此。看起来你也可能会遇到同样的问题。


如果留下 ~Email() {}; 这种形式,会不会摧毁整个对象呢? - Stefan Stojkovski
1
是的。但如果您未声明它,则会隐式创建一个。如果您的类为自己分配了资源并且需要释放这些资源,则需要声明一个。 - Iowa15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接