1 2 3 4 5 6 | #include <cstdio> int main() { printf("%c%c%c\n", 'T', 'V', 'P'); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <iostream> #include <vector> class Master{ protected: unsigned short i; public: Master():i(5){} virtual unsigned short get(){return 9;} }; class Sub:public Master{ public: Sub(){i=8;} unsigned short get(){return i;} }; int main(){ Master *M_ptr; Sub mySub; M_ptr = &mySub; Sub *S_ptr = dynamic_cast<Sub*>(M_ptr); if(S_ptr) // hier werkt het std::cout << "Works\n"; else std::cerr << "FAIL\n"; std::vector<Master> myVec; myVec.push_back(Sub()); Master *vec_ptr = &myVec[0]; Sub *S_ptr2 = dynamic_cast<Sub*>(vec_ptr); if(S_ptr2) // hier faalt het std::cout << "Works\n"; else std::cout << "FAIL\n"; return 0; } |
um, die destructor klopt idd maar er is toch een virtual methode?quote:Op zaterdag 29 januari 2011 00:15 schreef thabit het volgende:
Nog een probleem met je code is dat je de base class niet polymorf hebt gemaakt. Er moet tenminste 1 virtual methode in zitten; het is sowieso raadzaam om de destructor virtual te maken. Dat classes niet automatisch polymorf zijn is overigens ook een designflater.
O ja, overheen gelezen. Maar dan nog moet je geen polymorfisme toepassen op value-typed objecten.quote:Op zaterdag 29 januari 2011 12:18 schreef netolk het volgende:
[..]
um, die destructor klopt idd maar er is toch een virtual methode?
virtual unsigned short get(){return 9;}
1 | mingw/bin/../lib/gcc/mingw32/3.4.5/../../../../include/c++/3.4.5/ext/new_allocator.h:52: error: forming pointer to reference type `Master&' |
Ja, ik heb het zo bedacht:quote:Op zaterdag 29 januari 2011 17:52 schreef thabit het volgende:
Pas wel een beetje op dat je geen pointers naar ongedefinieerde stukken geheugen laat wijzen.
Ja, als er een destructor bestaat zal deze aangeroepen worden. Dit geldt echter alleen als je classes (of base-types) in de vector opslaat. Als je std::vector<X*> gebruikt, zal de X::~X() destructor niet automatisch aangeroepen worden. Daarom wordt het ook als niet netjes gezien om pointers in containers op te slaan.quote:Op zaterdag 29 januari 2011 18:01 schreef netolk het volgende:
nog een vraagje, roept een vector bij destruction ook de destructor van het type aan? dus zegmaar std::vector<int> roept die dan ook ~int() aan?
Gaat tegen het idee van de stl containers in, namelijk dat de container de eigenaar van de data is. Netter zou zijn de pointer in een class te wikkelen. Dit is echter erg afhankelijk van smaak en stijl, en iedereen weet dat daarover prima te twisten valt.quote:Op zaterdag 29 januari 2011 19:19 schreef thabit het volgende:
Niks mis met pointers in containers, mits je duidelijk aan elke new een delete koppelt.
Mensen kiezen vaak voor c++ vanwege de snelheid, niet omdat de taal zo lekker netjes weg te tikken is... Daarvoor zijn veel geschiktere talen (met garbage collector etc)quote:Op zaterdag 29 januari 2011 19:25 schreef GS42 het volgende:
[..]
Gaat tegen het idee van de stl containers in, namelijk dat de container de eigenaar van de data is. Netter zou zijn de pointer in een class te wikkelen. Dit is echter erg afhankelijk van smaak en stijl, en iedereen weet dat daarover prima te twisten valt.
tja ik kan het ook in een matrix / array zetten maar dat is weer gekut als je er data aan toe wilt voegen, dan kan dat wel met classes die dan naar het volgende object wijzen maar waarom zou ik dat doen als ik ook gewoon vector<int*> kan gebruiken? en het dan via een destructor kan laten verwijderenquote:Op zaterdag 29 januari 2011 19:14 schreef GS42 het volgende:
[..]
Ja, als er een destructor bestaat zal deze aangeroepen worden. Dit geldt echter alleen als je classes (of base-types) in de vector opslaat. Als je std::vector<X*> gebruikt, zal de X::~X() destructor niet automatisch aangeroepen worden. Daarom wordt het ook als niet netjes gezien om pointers in containers op te slaan.
Edit: Oh, ik had het bovenstaande antwoord gemist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> #include <vector> class Temp{ int i; public: Temp(){} ~Temp(){ std::cout << "Destructor\n"; } }; int main(){ std::vector<Temp> myvec; myvec.push_back(Temp()); return 0; } |
1 2 | Destructor Destructor |
Dat is mogelijk en niets om je zorgen over te maken. Bij het kopieren naar de vector is het mogelijk dat er een kopie gemaakt moet worden en dus voor het oude object een destructor aangeroepen wordt. (Sterker nog, aan de code van je kun je zien dat de compiler dit moet doen.) Ook moet een vector zichzelf vaak in geheugen verplaatsen waarbij het kopieen van objecten moet maken en de destructor kan gebruiken, evenals de copy constructor van de klasse (maar dit zou bij 1 object niet moeten gebeuren).quote:Op zaterdag 29 januari 2011 21:05 schreef netolk het volgende:
die ~int() was even een dummie voor de vraag, maar ik heb dus zo'n vector<Player> waar maar 1 player instaat en toch word de destructor 2x aangeroepen...
Bijvoorbeeld in het vorige voorbeeld. Als je de pointer in een klasse wikkelt die de geheugenafhandeling doet, hoef je er op dit moment niet meer aan te denken. Anders moet je voor elke klasse die een vector<int*> gebruikt, een destructor, copy constructor en eventueel een operator=() schrijven, terwijl een vector<IntPointer> dit zelf op zou kunnen lossen. Maar opnieuw: dit heeft veel met persoonlijke stijl te maken.quote:tja ik kan het ook in een matrix / array zetten maar dat is weer gekut als je er data aan toe wilt voegen, dan kan dat wel met classes die dan naar het volgende object wijzen maar waarom zou ik dat doen als ik ook gewoon vector<int*> kan gebruiken? en het dan via een destructor kan laten verwijderen
Omdat er 2 Temp-objecten zijn.quote:Op zaterdag 29 januari 2011 21:10 schreef netolk het volgende:
code bij mijn vorige post
[ code verwijderd ]
output:
[ code verwijderd ]
en als ik de push_back(Temp()) weglaat roept ie de destructor helemaal niet aan, maar waarom word de destructor 2x aangeroepen als er maar 1 object is?
JA, ik zie het nuquote:Op zaterdag 29 januari 2011 21:17 schreef thabit het volgende:
[..]
Omdat er 2 Temp-objecten zijn.. Zie je waarom?
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |