1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int _tmain(int argc, _TCHAR* argv[]) { int (*fpoint)(int) = doeietsmetgetal; cout << fpoint(5); return 0; } int doeietsmetgetal(int x){ int * y = new int(x*5); return *y; } |
En hoe zorg ik ervoor dat y geen geheugen meer inneemt? Niet aanroepen met new? En hoe delete ik m'n fpoint? Of moet ik dan van die doeietsmetgetal functie gewoon een class maken? En mag ik aannemen dat zodra een variabele die zonder new is gedeclareerd verwijderd wordt zodra de functie exit?quote:Op donderdag 5 augustus 2010 18:10 schreef thabit het volgende:
*y blijft inderdaad geheugen innemen omdat je new aanroept. Ook als je *fpoint wel zou kunnen verwijderen, dan blijven alle *y instanties gewoon geheugen innemen.
Ok en m'n functiepointer? Valt die gewoon te verwijderen? Of moet ik 'm dan in de scope van een functie zien te proppen?quote:Op donderdag 5 augustus 2010 18:35 schreef thabit het volgende:
Locale (niet-static) variabelen van functies worden op de stack aangemaakt, en die stackruimte wordt vrijgegeven als je de functie verlaat. De pointer y wordt dus ook vrijgegeven, maar niet de int *y waar hij naar verwijst. Ook is fpoint een functiepointer, dus gewoon een locale variabele die wordt verwijderd zodra je de functie verlaat. In het bovenstaande voorbeeld kun je beter
int y = x*5; return y;
doen, of zelfs direct return x*5;
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 | class Point{ unsigned short X,Y; public: Point(unsigned short x,unsigned short y):X(x),Y(y) {} unsigned short get_X(){return X;} unsigned short get_Y(){return Y;} }; class Shape{ public: virtual void Rotate(int)=0; virtual void Draw()=0; virtual bool is_Closed()=0; }; class Circle:public Shape{ Point _CENTER; unsigned _RADIUS; void Rotate(int); public: Circle(Point p,unsigned r):_CENTER(p),_RADIUS(r){} void Draw(); bool is_Closed(){return true;} }; } |
1 2 3 4 5 6 7 | int main(){ shp::Circle myCircle(shp::Point(40,20),5); //myCircle.Draw(); return 0; } |
1 2 | collect2: ld returned 1 exit status |
Dat is toch raar want Circle zou toch gewoon een virtual table moeten hebben aangezien zijn base class puur virtueel is?quote:Op vrijdag 6 augustus 2010 13:56 schreef Cruise.Elroy het volgende:
even een recompile ofzo? hij zegt dat Circle geen virtual table heeft, en blijkbaar ergens niet als derived class is gedefinieerd?
Geen idee verder.
Hmm... daar heb je idd een puntquote:Op vrijdag 6 augustus 2010 14:44 schreef thabit het volgende:
Hij is public in Shape. Dus als je een object van type Shape hebt, en weet niet wat voor Shape het is, moet je wel Rotate erop kunnen aanroepen. Maar goed, dat terzijde.
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 | #define SHAPE_H namespace shp{ class Point{ unsigned short X,Y; public: Point(unsigned short x,unsigned short y):X(x),Y(y) {} unsigned short get_X(){return X;} unsigned short get_Y(){return Y;} }; class Shape{ public: virtual void Rotate(int)=0; virtual void Draw()=0; virtual bool is_Closed()=0; }; class Polygon:public Shape{ public: bool is_Closed(){return true;} }; class Circle:public Shape{ Point _CENTER; unsigned _RADIUS; public: Circle(Point p,unsigned r):_CENTER(p),_RADIUS(r){} void Rotate(int); void Draw(); bool is_Closed(){return true;} }; } #endif |
Ja, iknow ik heb geen .cpp file maar die heb ik voor classes toch ook niet nodig??quote:
Hehe, daar kwam ik idd ook net achter...quote:Op vrijdag 6 augustus 2010 15:18 schreef thabit het volgende:
Dan zit daar dus het probleem: de functies Circle::Rotate en Circle::Draw zijn alleen gedeclareerd, maar niet gedefinieerd. Dat vindt de linker niet zo grappig (vandaar ook een 'ld' error: het compilen gaat op zich goed, alleen het linken wil niet).
Maar hij roept Rotate en Draw niet aanquote:Op vrijdag 6 augustus 2010 15:18 schreef thabit het volgende:
Dan zit daar dus het probleem: de functies Circle::Rotate en Circle::Draw zijn alleen gedeclareerd, maar niet gedefinieerd. Dat vindt de linker niet zo grappig (vandaar ook een 'ld' error: het compilen gaat op zich goed, alleen het linken wil niet).
C++ is geen Python.quote:Op vrijdag 6 augustus 2010 15:23 schreef TeringHenkie het volgende:
[..]
Maar hij roept Rotate en Draw niet aan
jepquote:Op vrijdag 6 augustus 2010 15:31 schreef Cruise.Elroy het volgende:
Wel rare error voor een linkerfout. Maar is het nu gefixed?
hoe zo als reference dan? kost dan minder resources?quote:Op vrijdag 6 augustus 2010 15:25 schreef thabit het volgende:
Nog wat algemene opmerkingen: als je een base class aanmaakt, waar je classes van wilt afleiden, is het raadzaam om ook de destructor virtual te maken. En in de constructor van Circle kun je Point beter als reference doorgeven dan als value.
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |