18. juni 2002 - 22:30Der 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.
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(); }
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 ?
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
// 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..!
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.
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.