Wedvich Skrevet 28. september 2011 Del Skrevet 28. september 2011 (endret) Hei! Jobber med en innlevering til skolen og har i den forbindelse forsøkt å lage meg en baseklasse så jeg slipper å gjenta en haug med kode. Klasser som deriverer fra denne har en liste med pekere til komponenter av template-typen som kan manipuleres med to funksjoner, for å legge til og fjerne komponenter igjen. De fleste deriverte klassene av denne har en template-type der komponentene har en standardfunksjon, og kan iterere over komponentene og kalle på denne standardfunksjonen for hvert av dem. Hvert av komponentene har så selv kontroll over når de blir slettet, ved å ha en referanse til den deriverte klassen med komponentene og kalle på den via f.eks. parent->Remove(this). Koden er under: #ifndef _CComponentManager_h #define _CComponentManager_h #include "Includes.h" // Base class with helper functions for managers with a container of components to update template <typename T> class CComponentManager { public: // Push a new component onto the top void CComponentManager<T>::Push(T *t) { m_components.push_back(t); } // Remove a component void CComponentManager<T>::Remove(T *t) { for (vector<T *>::const_iterator i = m_components.begin(); i != m_components.end(); ++i) { if (*i == t) { m_components.erase(i); delete t; break; } } } protected: vector<T *> m_components; }; #endif Meningen er da at når et komponent kaller på Remove(this) skal det finne pekeren sin i listen, slette denne derfra og så slette objektet som pekes til fra minnet. Problemet er at pekeren blir slettet, men destruktøren til komponentet som slettes blir aldri kalt på. Dette tolker jeg dithen at delete t i Remove-funksjonen ikke faktisk sletter objektet (for delete skal vel kalle på destruktøren til objektet som slettes?). Jeg er ganske fersk med pekere så det er godt mulig at dette er obvious, og da beklager jeg at jeg spør dumt, men kan noen forklare meg hvorfor dette ikke fungerer? Når jeg legger til nye komponenter er det på formen parent->Push(new Component()); hvis det er relevant. Hva gjør jeg feil? Hvordan får jeg objektet til å faktisk slettes så destruktøren også kalles? EDIT: Fant vel egentlig ut av det, disse komponentene bestod også av deriverte klasser, og jeg hadde glemt å sette virtuell destruktør på baseklassene der. Endret 28. september 2011 av Wedvich Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå