abonnement Unibet Coolblue Bitvavo
pi_84901865
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int doeietsmetgetal(int);

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;

}
Hoe zit het hier met *y? Blijft deze geheugen innemen totdat mijn programma afsluit? Ik kan namelijk *fpoint niet verwijderen, aangezien ik 'm niet met new gecreëerd heb.
pi_84901945
*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.
pi_84902011
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.
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?
pi_84902611
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;
pi_84902855
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;
Ok en m'n functiepointer? Valt die gewoon te verwijderen? Of moet ik 'm dan in de scope van een functie zien te proppen?
pi_84903151
Je functiepointer is gewoon een lokale variabele en zit in de scope van _tmain. In dit voorbeeld heb je verder geen functiepointers nodig en kun je gewoon
cout << doeietsmetgetal(5);
doen.
pi_84907795
Thanks! ^O^
  vrijdag 6 augustus 2010 @ 13:51:23 #183
189216 netolk
maar dan andersom
pi_84936110
Hey,

Ik heb een probleem met virtual functies...

ik heb een namespace gemaakt in een header genaamd Shape.h
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
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 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;}
    };
}
en ik heb dan in mn main het volgende staan:
1
2
3
4
5
6
7
#include "Shape.h"
int main(){
    shp::Circle myCircle(shp::Point(40,20),5);
    
    //myCircle.Draw();
    return 0;
}
Als ik dit probeer te compileren krijg ik de volgende foutmelding:
1
2
...l\Temp/ccoiasqN.o:main.cpp:(.text$_ZN3shp6CircleC1ENS_5PointEj[shp::Circle::Circle(shp::Point, unsigned int)]+0x16): undefined reference to `vtable for shp::Circle'
collect2: ld returned 1 exit status
ik gebruik G++ als compiler, zou iemand me kunnen vertellen wat ik dan niet goed doe?
Beware of the Raping Zebra's
pi_84936360
even een recompile ofzo? hij zegt dat Circle geen virtual table heeft, en blijkbaar ergens niet als derived class is gedefinieerd?

Geen idee verder.
  vrijdag 6 augustus 2010 @ 14:01:44 #185
189216 netolk
maar dan andersom
pi_84936577
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.
Dat is toch raar want Circle zou toch gewoon een virtual table moeten hebben aangezien zijn base class puur virtueel is?
Beware of the Raping Zebra's
pi_84938228
Waarom heb je Circle::Rotate private gemaakt?
  vrijdag 6 augustus 2010 @ 14:41:10 #187
189216 netolk
maar dan andersom
pi_84938305
nou omdat een cirkel roteren niet echt nuttig is...
maar ik dacht miss is dat het probleem maar toen ik hem public had kreeg ik nog steeds de zelfde melding...
Beware of the Raping Zebra's
pi_84938455
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.
  vrijdag 6 augustus 2010 @ 14:47:01 #189
189216 netolk
maar dan andersom
pi_84938565
quote:
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.
Hmm... daar heb je idd een punt
Beware of the Raping Zebra's
pi_84938850
Misschien zit de fout in Shape.cpp, kun je die tonen?
  vrijdag 6 augustus 2010 @ 15:03:55 #191
189216 netolk
maar dan andersom
pi_84939258
Staat ook in mn 1e post maar ik zal hem nog een keertje neerzetten
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
#ifndef SHAPE_H
#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
ik heb die Circle::rotate(int) ook maar even public gemaakt

[ Bericht 4% gewijzigd door netolk op 06-08-2010 15:17:26 ]
Beware of the Raping Zebra's
pi_84939357
Dat is een header file, geen cpp file.
  vrijdag 6 augustus 2010 @ 15:16:45 #193
189216 netolk
maar dan andersom
pi_84939814
quote:
Op vrijdag 6 augustus 2010 15:06 schreef thabit het volgende:
Dat is een header file, geen cpp file.
Ja, iknow ik heb geen .cpp file maar die heb ik voor classes toch ook niet nodig??

Ik heb de functies nog niet verder uitgewerkt, dus nog geen .cpp
Beware of the Raping Zebra's
pi_84939909
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).
  vrijdag 6 augustus 2010 @ 15:19:35 #195
189216 netolk
maar dan andersom
pi_84939958
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).
Hehe, daar kwam ik idd ook net achter...

Best wel dom, nouja bedankt in iedergeval
Beware of the Raping Zebra's
pi_84940150
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 aan
pi_84940218
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.
pi_84940235
quote:
Op vrijdag 6 augustus 2010 15:23 schreef TeringHenkie het volgende:

[..]

Maar hij roept Rotate en Draw niet aan
C++ is geen Python.

[ Bericht 0% gewijzigd door thabit op 06-08-2010 15:33:57 ]
pi_84940507
Wel rare error voor een linkerfout. Maar is het nu gefixed?
  vrijdag 6 augustus 2010 @ 15:46:33 #200
189216 netolk
maar dan andersom
pi_84941123
quote:
Op vrijdag 6 augustus 2010 15:31 schreef Cruise.Elroy het volgende:
Wel rare error voor een linkerfout. Maar is het nu gefixed?
jep

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.
hoe zo als reference dan? kost dan minder resources?

En die destructor moet ik die in de afgeleide classes ook neerzetten of kan ik dat achterwege laten? (tenzij ik een destructor nodig heb natuurlijk)
Beware of the Raping Zebra's
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')