abonnement Unibet Coolblue Bitvavo
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
pi_84941323
Die destructor maak je virtual zodat hij (automatisch) kan worden aangeroepen als je afgeleide klassen destruct. Anders krijg je later evt. memory leaks (hoeft eigenlijk alleen als je destructor echt iets doet maar het is wel goed om het aan te leren)

En ja, als reference heb je iets minder resources maar in dit geval maakt het niet heel veel uit.
  vrijdag 6 augustus 2010 @ 18:07:12 #202
189216 netolk
maar dan andersom
pi_84947213
ik heb nog een vraagje bestaat er ook iets als #exclude? aangezien je wel #define en #undef hebt...
Beware of the Raping Zebra's
pi_84947322
Euh? Nee want met #include wordt de file direct in je parser geramd. Dus dat later weer undo-en is niet te doen.

#include zet de inhoud van de file direct tussen je code, het is niet zoals in Java e.d.
Je kan dus een losse regel code in een file zetten, en deze dan includen midden in een functie bijvoorbeeld :)
pi_84948288
echt, cruise.elroy, jij weet tenminste echt waar je over praat.. O+

Ik word echt doodmoe van alle programmeurs waarmee ik al heb moeten werken en die, zodra ze hun database connectie niet kunnen instellen via een Wizard, niet weten hoe het moet :')

Echt schijtziek word ik er van, totaal geen computer kennis meer...
Wat maakt het nou uit hoe het geheugen werkt, je propt er toch gewoon een extra bankje bij als het te traag wordt :')
"Wie niet gelooft in wonderen, is geen realist."
pi_84948486
quote:
Op vrijdag 6 augustus 2010 18:39 schreef progje het volgende:
Echt schijtziek word ik er van, totaal geen computer kennis meer...
Wat maakt het nou uit hoe het geheugen werkt, je propt er toch gewoon een extra bankje bij als het te traag wordt :')
Da's een kwestie van economie: goede hardware is tegenwoordig goedkoper dan een goede programmeur.
pi_84948619
quote:
Op vrijdag 6 augustus 2010 18:46 schreef thabit het volgende:

[..]

Da's een kwestie van economie: goede hardware is tegenwoordig goedkoper dan een goede programmeur.
Nou, als de salaris-eis nou ook eens in overeenstemming was met het gewenste niveau..
Maar dat laat helaas ook nog vaak te wensen over.

En allemaal zo heerlijk groot ego, ze vinden zichzelf allemaal de beste en overleggen ho maar :r

verder ben ik niet gefrustreerd hoor. ;)

Nu werk ik zelf in een omgeving waar ook veel in .Net en C# wordt geprogrammeerd, misschien hoort het ook wel bij dat wereldje ik weet het niet..
"Wie niet gelooft in wonderen, is geen realist."
pi_84952114
quote:
Op vrijdag 6 augustus 2010 18:49 schreef progje het volgende:

[..]

Nou, als de salaris-eis nou ook eens in overeenstemming was met het gewenste niveau..
Maar dat laat helaas ook nog vaak te wensen over.

En allemaal zo heerlijk groot ego, ze vinden zichzelf allemaal de beste en overleggen ho maar :r

verder ben ik niet gefrustreerd hoor. ;)

Nu werk ik zelf in een omgeving waar ook veel in .Net en C# wordt geprogrammeerd, misschien hoort het ook wel bij dat wereldje ik weet het niet..
Ik neem aan dat een C++ programmeur wel meer verdient dan iemand die formpjes in elkaar klikt in C#?
pi_84952820
Hehe ja dat zeker.. :)

Maar ik ken ook genoeg Senior C#/asp.net programmeurs die er werkelijk waar geen drol van begrijpen..
En toch ook een salaris verdienen van in de 4000 euro, maar ja

Al hebben we ook eens een Senior C++ programmeur in dienst gehad en ik begreep er destijds (als junior) al meer van dan hij :') Maar ja die heb je er altijd tussen zitten he.
"Wie niet gelooft in wonderen, is geen realist."
pi_84954344
Grappig is trouwens wel dat de Assemblies van Microsoft gewoon wrappers om Win32 zijn. Bijvoorbeeld Messagebox.Show roept uiteindelijk gewoon MessageBox aan in user32.dll. Als iets niet kan in C#, is er nog geen developer daar die er een wrapper voor heeft geschreven. _O-

Conclusie: C# voor de GUI, en de snelle/geavanceerde code stop je in een c++ DLL die je dan DllImport :P
  vrijdag 6 augustus 2010 @ 23:32:28 #210
189216 netolk
maar dan andersom
pi_84960271
quote:
Op vrijdag 6 augustus 2010 18:10 schreef Cruise.Elroy het volgende:
Euh? Nee want met #include wordt de file direct in je parser geramd. Dus dat later weer undo-en is niet te doen.

#include zet de inhoud van de file direct tussen je code, het is niet zoals in Java e.d.
Je kan dus een losse regel code in een file zetten, en deze dan includen midden in een functie bijvoorbeeld :)
Ja daar was ik al bang voor :P, ik dacht miss kan het dus als je in een header a header b include dan kan je dus overal waar a geinclude word ook die van b gebruiken...
Beware of the Raping Zebra's
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')