Avatar billede roger Nybegynder
18. juni 2002 - 22:30 Der er 10 kommentarer og
1 løsning

destructor

Hej

Jeg begyndte at kigge på c++ i går ved at læse enkelte artikler og afprøve lidt hist og her. Jeg er gået lidt i stå overfor begrebet destructor. Tidligere har jeg beskæftiget mig med java, hvor garbagecollectoren ordner skidtet for en.

Mit spørgsmål går på, om der er en der kan forklare mig hvordan man implementer en destructor, altså hvad skriver man i den?

Lad os bare antage at jeg har en klasse der hedder Bog med attributterne titel, forfatter og forlag, og tilhørende get- og setMetoder.
Avatar billede naxosnaxos Nybegynder
18. juni 2002 - 23:30 #1
Hej

En destructor bruges når du opretter objekter dynamisk med new. For at undgå memory leak laver man sin destructor.
Til din klasse bog vil du have en constructor der hedder BOG(.....) og en destructor ~Bog(). I ~Bog laver du delete på de objekter der bliver oprettet med new og skal nedlægges i destructoren, så der frigøres hukommelse.... giver lige et eksempel

vi siger du har en .hpp fil hvor du erklærer dine constructor og destructor..

i din cpp fil kommer nu følgende hvor der som eksempel oprettes et objekt i constructoren og nedlægges i destructoren

Her burde være nogle includes....

Bog::Bog()
{
  //her oprettes objektet. Dette er blot en måde...
  Bog *bogObj;
  bogObj = new Bog();
}

Bog::~Bog()
{
  //her slettes obejktet
  delete [] bogObj();
}

Håber det kan hjælpe lidt...ellers fyr løs
/Rasmus - JJnet.dk
Avatar billede roger Nybegynder
19. juni 2002 - 01:31 #2
Argh kan være jeg skal læse på lektien, men spørger alligevel. Som nævnt kender jeg intet til c++, men derimod til java.

i java ville jeg f.eks lave contructoren sådan:

public Bog(String titel){
setTitel(titel);
}

og når jeg opretter bogobjektet et sted i mit program ville jeg skrive:

Bog minBog = new Bog("Helly Hansens varme vanter");

mht. din kode, er jeg ikke helt med på:

Bog::Bog()
{
  //her oprettes objektet. Dette er blot en måde...
  Bog *bogObj;
  bogObj = new Bog();
}

Opretter du et bogobjekt, når constructoren kaldes ?
Opretter den ikke automatisk et bogobjekt når man kalder constructoren, uanset om der ingen implementering er i constructoren ?
Avatar billede sif4ever Nybegynder
19. juni 2002 - 01:39 #3
mmm jo det var ikke den bedste måde at vise det på.. det gør den selvfølgelig på den måde jeg skrev vil der blive oprettet 2 objekter ved constructor kald. Pinligt min fejl, men ellers er det som du ville gøre i java.... jeg koder også selv java ;o)
/Rasmus

ps. lidt point måske .....
Avatar billede naxosnaxos Nybegynder
19. juni 2002 - 01:42 #4
ups igen igen det var den forkerte konto jeg var logget ind med...så det var nu mig selv der svarede...

/Rasmus
Avatar billede jpk Nybegynder
19. juni 2002 - 08:47 #5
Hvis du har en class Bog:

class Bog
{
protected:
  string m_strTitle;
};


// Default constructor
Bog::Bog()
{
}

// Constructor der tager titlen som argument
Bog::Bog(string strTitle)
{
  m_strTitle = strTitle;
  // Du kan også vælge at bruge SetTitle(strTitle) hvis du foretrækker...
}

// Constructoren behøver ikke 'delete' noget da klassen string's destructor selv sletter den memory den har allokeret på heap'en
Bog::~Bog()
{
}


Laver du derimod følgende:
class Bog
{
protected:
  string* m_pstrTitle; // Bemærk nu er det en pointer
};

// Default constructor
Bog::Bog()
{
  m_pstrTitle = new string;
}
Skal du selv sørge for at kalde delete på det stykke memory, altså skal din destructor se sådan ud:
Bog::~Bog()
{
  delete m_pstrTitle;
}



>> naxosnaxos, du kan jo ikke gøre som du har vist ovenfor, du har jo ikke længere en pointer/reference til dit Bog-objekt, i din destructor..!
Avatar billede kamikaze Nybegynder
19. juni 2002 - 08:51 #6
Hmmm...Med den constructor vil du oprette et nyt bogobjekt der kalder constructoren som opretter et nyt bogobjekt som kalder constructoren som opretter.....osv. osv.
Avatar billede kamikaze Nybegynder
19. juni 2002 - 08:51 #7
jpk >> altså med den forrige.....(havde ikke set din :-)
Avatar billede kamikaze Nybegynder
19. juni 2002 - 12:49 #8
Generelt skal du selv sørge for at delete de objekter du har lavet med new, dvs. antallet af new-kald og delete-kald skal stemme overens.
Avatar billede naxosnaxos Nybegynder
19. juni 2002 - 12:56 #9
Lige et spg. til kamikaze.
Har du nogen forbindelse til Kamikaze-internet.dk i MG50 i Århus??
/Rasmus
Avatar billede roger Nybegynder
19. juni 2002 - 13:43 #10
Tusind tak. der fangede jeg den.

dele 10 point argh :-)

naxosnaxos får de 10 point. Opretter et nyt med 20 point, så kan i andre 2 få 10 hver, det må være fair.
Avatar billede kamikaze Nybegynder
19. juni 2002 - 21:28 #11
naxosnaxos >> Nej, ingen forbindelse :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester