【问题标题】:Undefined reference to destructor error in c++?c++ 中对析构函数错误的未定义引用?
【发布时间】:2013-08-20 14:09:15
【问题描述】:

这里是类

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()在哪里实现?

标签: c++ class destructor


【解决方案1】:

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

~Email();

...但没有为它定义一个主体。也许你的意思是;

~Email() { }

...或者如果它没有功能就直接忽略它?

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

【讨论】:

  • 哦,我认为不管有没有括号,它都可以工作,你说的是构造函数,但它前面有 ~ 所以它是一个析构函数。我知道我不必编写构造函数,如果我愿意,我会使用编译器提供的默认值,但它是否也提供默认析构函数,或者我必须编写 ~Email() { } 才能按顺序释放释放内存空间?
  • 默认构造函数和析构函数是免费的。在 C++11 中,这就像“~Email()=default;”一样简单。当你在做的时候,为什么不使用 std::string 而不是固定长度的字符缓冲区来存储类内数据?
  • 哎呀,是的,在析构函数/构造函数的措辞上有错字。现已修复。
  • 你能告诉我为了使用std:string需要改变什么吗?如果我尽可能多地进行改变,我的程序会崩溃吗?
  • @StefanStojkovski 将所有 char* 更改为 std::string 并使用常规 = 而不是 strcpy 应该让你开始,为了优化你需要传递 const std::string&amp; 而不是普通的 std::string尽可能多的参数,但这是次要的,因为在大多数情况下两者都有效。如果您有其他特定问题,也许您可​​以提出一个新问题,它往往会得到调试专家的更多关注:)
【解决方案2】:

你必须定义你的析构函数,而不仅仅是声明它。没有可见的实现。做这样的事情:

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

如果你不想对你的析构函数做任何事情,那么就不要声明它。还要确保你为你的构造函数做同样的事情。看来你也有同样的问题。

【讨论】:

  • 如果离开它不会破坏整个对象 ~Email() {};
  • 是的。但是,如果您不声明它,则会隐式创建一个。如果您的班级为自己分配了您需要释放的资源,您将声明一个。
猜你喜欢
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-10
  • 1970-01-01
  • 2020-02-08
  • 2021-06-08
相关资源
最近更新 更多