Referință nedefinită la eroarea destructorului în c++? (Programare, C++, Clasa, Destructor)

Stefan Stojkovski a intrebat.

Aici este clasa

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;
    }
};

și după cum puteți vedea include un destructor. Restul programului este doar o funcție și main.

int checkEmail(char *p){
int n=0,i=0;
while(p[i]!='')
{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!";
}

Acesta dă o eroare

  1. objDebugmain.o|||În funcția `main’:| |
  2. C:UsersStefanDesktopEMailmain.cpp|58|undefined reference to `Email::~Email()’|
  3. C:UsersStefanDesktopEMailmain.cpp|58|undefined reference to `Email::~Email()’|
  4. ||=== Construire finalizată: 2 erori, 0 avertismente (0 minute, 1 secundă) ===|

în linia care conține o.print();Deci, ce este? De asemenea, poate să-mi spună sb. cum să evidențiez unele linii din codul meu?

Comentarii

  • Unde este destructorul dvs. ~Email() implementat? –  > Por P0W.
2 răspunsuri
Joachim Isaksson

Declarați un destructor;

~Email();

…dar nu definești un corp pentru el. Poate că vrei să spui;

~Email() { }

…sau să îl omiteți pur și simplu dacă nu are nicio funcționalitate?

(Îți lipsește, de asemenea, o declarație de corp pentru constructorul tău implicit)

Comentarii

  • Oh, am crezut că funcționează oricum, cu sau fără acele paranteze, iar tu spui constructor, dar are ~ în față, deci este un destructor. Știu că nu trebuie să scriu un constructor și dacă aș vrea aș putea folosi default oferit de compilator, dar oferă și un destructor implicit sau trebuie să scriu ~Email() { } pentru a elibera spațiul în memorie? –  > Por Stefan Stojkovski.
  • Constructorii și destructori impliciți sunt oferiți gratuit. În C++11, acest lucru este la fel de simplu ca „~Email()=default;”. Dacă tot sunteți aici, de ce nu folosiți std::string în loc de tampoane char de lungime fixă pentru datele din clasă? –  > Por Sven.
  • Ups, da, am făcut o greșeală de tipar în ceea ce privește formularea destructor/constructor. S-a reparat acum. –  > Por Joachim Isaksson.
  • Puteți spune ce trebuie să schimbați pentru a folosi std:string, programul meu se blochează dacă fac modificarea, din câte știu? –  > Por Stefan Stojkovski.
  • @StefanStojkovski Schimbați toți char* în std::string și folosiți regular = în loc de strcpy ar trebui să vă ajute să începeți, pentru optimizare veți dori să treceți const std::string& în loc de simplu std::string ca parametri cât mai mult posibil, dar asta este secundar, deoarece ambele funcționează în majoritatea cazurilor. Dacă aveți o altă problemă specială, poate că ați putea începe o nouă întrebare, tinde să primească mai multă atenție din partea guru de depanare 🙂 –  > Por Joachim Isaksson.
Iowa15

Trebuie să vă definiți destructorul, nu doar să îl declarați. Nu există o implementare vizibilă. Faceți ceva de genul acesta:

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

Dacă nu vreți să faceți nimic cu destructorul dvs., atunci nici măcar nu-l declarați. De asemenea, asigurați-vă că faceți același lucru pentru constructorul dvs. Se pare că și tu ai putea avea aceeași problemă cu el.

Comentarii

  • Nu va distruge întregul obiect dacă este lăsat ~Email() {}; –  > Por Stefan Stojkovski.
  • Da. Dar dacă nu îl declarați, unul este creat implicit. Ai declara unul dacă clasa ta ar aloca resurse pentru ea însăși pe care trebuie să le eliberezi. –  > Por Iowa15.