25. februar 2010 - 17:00
Der er
15 kommentarer og 1 løsning
vtable linker problem
Hej. Vi (HTX gruppe opgave) er igang med at lave et lille spil ic++/QT. Vi har lavet en klasse som skal styre en bamse. Vores kode ser således ud: bamse.h: #ifndef BAMSE_H #define BAMSE_H #include <QLabel> #include <QImage> #include <QPixmap> #include <QThread> class bamse : public QLabel { Q_OBJECT public: bamse(void); virtual ~bamse(); void Go_right(); void Go_left(); void Jump(); void Go_down(); private: int H; int W; int GP_X; //GlobalPosition X int GP_Y; //GlobalPosition Y QImage Teddy_image_Go_Right_1; QImage Teddy_image_Go_Left_1; }; #endif // BAMSE_H og koden til vores contructor ser således ud:bamse::bamse(void) { this->H = 80; this->W = 80; this->GP_X = 0; this->GP_Y = 800; QImage Teddy_image; Teddy_image.load("Graphic/Teddy.gif"); this->setPixmap(QPixmap::fromImage(Teddy_image)); // this->setParent(parent); this->setGeometry(QRect(this->GP_X,this->GP_Y,this->H, this->W)); this->show(); //Load diverse andre Teddy-billeder Teddy_image_Go_Left_1.load("Graphic/Teddy_Go_Left_1.gif"); Teddy_image_Go_Right_1.load("Graphic/Teddy_Go_Right_1.gif"); } Når vi prøver at compile det, får vi denne rimelige uforståelige linker fejl: /home/batnas/Ubuntu One/Skole/KI/Computerspil/Pige-spil/bamse/bamse.cpp:3: undefined reference to `vtable for bamse' Vi kan desværre ikke give så mange flere oplysninger pt. da vi er helt på bar bund omkring hvor fejlen ligger. Håber i kan hjælpe. Mvh. Nicklas og Jonas
Annonceindlæg fra Hitachi
”Forskellighed gør os stærkere!”
Diversitet er ikke kun buzzwords og politisk korrekthed, men et spørgsmål om at alle føler sig godt tilpas og kan yde deres bedste.
31. januar 2025
25. februar 2010 - 17:11
#1
Lidt googling antyder at fejlen skyldes at der mangler at blive defineret nogle metoder i bamse.cpp !
25. februar 2010 - 17:15
#2
metoder = funktioner? For hvis det er tilfældet forstår jeg det ikke
25. februar 2010 - 17:17
#3
Har lige tjekket det igen, alle funktioner der er defineret i header filen er også defineret i cpp filen
25. februar 2010 - 17:20
#4
den fulde cpp fil ser således ud: [code] #include "bamse.h" bamse::~bamse() { } bamse::bamse(void) { this->H = 80; this->W = 80; this->GP_X = 0; this->GP_Y = 800; QImage Teddy_image; Teddy_image.load("Graphic/Teddy.gif"); this->setPixmap(QPixmap::fromImage(Teddy_image)); // this->setParent(parent); this->setGeometry(QRect(this->GP_X,this->GP_Y,this->H, this->W)); this->show(); //Load diverse andre Teddy-billeder Teddy_image_Go_Left_1.load("Graphic/Teddy_Go_Left_1.gif"); Teddy_image_Go_Right_1.load("Graphic/Teddy_Go_Right_1.gif"); } void bamse::Go_right() { //Change global position variable this->GP_X++; //update teddy image this->setPixmap(QPixmap::fromImage(Teddy_image_Go_Right_1)); //update teddy position this->setGeometry(QRect(this->GP_X,this->GP_Y,this->H, this->W)); } void bamse::Go_left() { //Change global position variable this->GP_X--; //update teddy image this->setPixmap(QPixmap::fromImage(Teddy_image_Go_Left_1)); //update teddy position this->setGeometry(QRect(this->GP_X,this->GP_Y,this->H, this->W)); } void bamse::Jump() { //Change global position variable this->GP_Y += 50; //update teddy position this->setGeometry(QRect(this->GP_X,this->GP_Y,this->H, this->W)); } void bamse::Go_down() { if(!((this->GP_Y + 1 + this->H) > 800)) { //Change global position variable this->GP_Y--; //update teddy position this->setGeometry(QRect(this->GP_X,this->GP_Y,this->H, this->W)); } } [/code]
25. februar 2010 - 17:21
#5
der er vist noget fejl i visning af kode på eksperten ;)
25. februar 2010 - 17:32
#6
metoder = funktioner i klasse Er der nogle pure virtual metode i QLabel klassen som jeres klasse skal have?
25. februar 2010 - 17:36
#7
Og igen er jeg ikke helt med. Jeg er ikke helt sikker på hvad pure virtual metoder er. Kunne du give en lille forklaring (hjælp til selvhjælp).
25. februar 2010 - 17:42
#8
Hvis QLabel klassen har en: virtual void foobar() = 0; saa skal din klasse have den foobar metode.
25. februar 2010 - 17:46
#9
Okay lyder underligt. Da QLabal er en del af QT bibliotek som jeg uden problemer kan kalde ved QLabel *x = new QLabel. Men hvad er forskellen på virtual metoder og ikke virtual metoder?
25. februar 2010 - 17:56
#10
Jeg har læst lidt om hvad virtuelle functioner er. Men hvorfor skal den have fx. foobar metoden, hvis man ikke skal bruge den til noget?
25. februar 2010 - 18:02
#11
Hvis du kan kave: QLabel *x = new QLabel(); saa er det ikke det.
25. februar 2010 - 18:04
#12
Googling af den fejl i faar siger at det skyldes en manglende metode. Jeg famler bare i moerke efter noget som passer med det.
25. februar 2010 - 18:06
#13
virtual versus ikke-virtual er lidt svaert at forklare men det er ogsaa meget vigtigt at forstaa ! Proev foelgende lille demo: #include <iostream> #include <cstdlib> using namespace std; class P1 { public: void foobar(); }; class C1 : public P1 { public: void foobar(); }; class P2 { public: virtual void foobar(); }; class C2 : public P2 { public: virtual void foobar(); }; void P1::foobar() { cout << "P1" << endl; return; } void C1::foobar() { cout << "C1" << endl; return; } void P2::foobar() { cout << "P2" << endl; return; } void C2::foobar() { cout << "C2" << endl; return; } int main(int argc,char *argv[]) { P1 *p1 = new P1(); p1->foobar(); P2 *p2 = new P2(); p2->foobar(); C1 *c1 = new C1(); c1->foobar(); C2 *c2 = new C2(); c2->foobar(); P1 *m1 = new C1(); m1->foobar(); P2 *m2 = new C2(); m2->foobar(); exit(EXIT_SUCCESS); }
26. februar 2010 - 01:14
#14
Har fundet ud af det... kommer med en forklaring imorgen... Tak for hjælpen arne_v du må godt ligge et svar
26. februar 2010 - 03:42
#15
Gerne, men har jeg hjulpet med noget ??
26. februar 2010 - 14:18
#16
både og... Den forklaring om virtuelle funktioner hjalp mig til at bygge min klasse om på en meget bedre måde... Jeg vil sige det er 200 point vær :D
Kurser inden for grundlæggende programmering