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 Computerworld it-jobbank
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