Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Da's logisch, je creeert namelijk een nieuw temporary object.maar dan wordt na het voltooien van de constructor ook de destructor automatisch uitgevoerd...
En nee, het kan helaas niet zoals in java, dan heb je een extra functie nodig die je kan aanroepen.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Je kunt je object wel destructen en opnieuw constructen mbv placement new
1
2
3
4
5
6
7
8
9
10
| #include <new> struct A { void reconstruct () { this->~A (); new (this) A (); } }; |
(dus wel even <new> includen)
[ Voor 3% gewijzigd door .oisyn op 04-12-2003 21:15 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
[ Voor 12% gewijzigd door riezebosch op 04-12-2003 21:30 ]
Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack
Je kunt het in feite ook doen vanuit je constructor, maar echt netjes is het niet, omdat je object dan nog niet in volledig geconstructe staat is. Bovendien loop je dan kans dat de constructoren van de base classes meerdere keren worden aangeroepen. Je moet dus eerst de destructor aanroepen voordat je de constructor aanroept dmv de placing new. Maar ja, de destructor is pas zinnig op het moment dat je object in geconstructe staat is en alle locale classvariabelen geinitialiseerd zijn (dus je moet het object sowieso eerst constructen voordat je de destructor aan kan roepen
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
1
2
3
4
| public MyClass(int i) : MyClass()
{
miBlaat = i;
} |
https://fgheysels.github.io/
(Wordt overigens aan gewerkt)
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
* curry684 heeft hier ooit eens per ongeluk tegen gezondigd en 3 dagen moeten zoeken naar het probleem....
MSalters schreef op 05 december 2003 @ 11:14:
Ja, natuurlijk kan dat niet. De initializer list mag alleen members en base classes bevatten.
(Wordt overigens aan gewerkt)
Als je de gewone, 0 argument constructor hebt gedefinieerd is 'ie toch ook een member van je class ?
Da's in C# wel mogelijk.curry684 schreef op 05 december 2003 @ 11:37:
En mental note: als je een Initialize-functie maakt die vanuit iedere ctor wordt aangeroepen mag die *niet* virtual of pure virtual zijn omdat je vtable tijdens de construction nog niet beschikbaar is.
* curry684 heeft hier ooit eens per ongeluk tegen gezondigd en 3 dagen moeten zoeken naar het probleem....
[ Voor 42% gewijzigd door whoami op 05-12-2003 11:53 ]
https://fgheysels.github.io/
Daarom is C++ ook een 'iets' snellere en dichter-bij-assembler taal
nou dat mag wel, het wordt alleen een directe call, en geen virtual call. Je kunt geen virtual methode implementeren in een derived class die door de base constructor wordt aangeroepen, want die roept dan gewoon z'n eigen implementatie aan (en als ie in de base pure was dan krijg je meestal sowieso een compile warning). Want in de constructor is de class ook gewoon van het type van de huidige constructor, en niet een van z'n subclasses. Hij wordt pas dat type als de constructor van dat type is aangeroepencurry684 schreef op 05 december 2003 @ 11:37:
En mental note: als je een Initialize-functie maakt die vanuit iedere ctor wordt aangeroepen mag die *niet* virtual of pure virtual zijn omdat je vtable tijdens de construction nog niet beschikbaar is.
* curry684 heeft hier ooit eens per ongeluk tegen gezondigd en 3 dagen moeten zoeken naar het probleem....
En ja, in een constructor wordt ook de vtable geinitializeerd naar dat type, dus het is vrij logisch
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Het verschil tussen 'mogen' en 'levert wild onvoorspelbare en idiote effecten' vind ik in dit geval dermate klein dat ik de term 'dat mag niet' zeer verantwoord vind.oisyn schreef op 05 december 2003 @ 15:09:
[...]
nou dat mag wel, het wordt alleen een directe call, en geen virtual call. Je kunt geen virtual methode implementeren in een derived class die door de base constructor wordt aangeroepen, want die roept dan gewoon z'n eigen implementatie aan (en als ie in de base pure was dan krijg je meestal sowieso een compile warning). Want in de constructor is de class ook gewoon van het type van de huidige constructor, en niet een van z'n subclasses. Hij wordt pas dat type als de constructor van dat type is aangeroepen
Tuurlijk is het logisch. Ook lulligEn ja, in een constructor wordt ook de vtable geinitializeerd naar dat type, dus het is vrij logisch
Een Base is at construction time gewoon een Base, en geen Derived. Derhalve roept het ook geen virtual methoden aan van Derived, net als bij het geval dat je gewoon een Base instantieert.
En het heeft ook geen enkel zin als het wel zou kunnen. De constructor van Derived is nog niet aangeroepen, dus de members van Derived zijn ook nog niet geinitializeerd.
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
Je weet vast wel wat ik bedoel; C::C ( args ) : Base(...), Base(...), datamember(...), datamember(...) { /***/ }whoami schreef op 05 december 2003 @ 11:53:
[...]
Als je de gewone, 0 argument constructor hebt gedefinieerd is 'ie toch ook een member van je class ?
Dit is overigens een geval van geen bijzonder goede reden. Er zitten een paar subtiliteiten in (object compleet na ctor exit, maar als je 2 ctors gebruikt, wanneer is het object dan compleet?) en wat implementatie details (in theorie interactie met new), maar niks groots.
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein