Avatar billede nicklasw Nybegynder
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
Avatar billede arne_v Ekspert
25. februar 2010 - 17:11 #1
Lidt googling antyder at fejlen skyldes at der mangler at blive defineret nogle metoder i bamse.cpp !
Avatar billede nicklasw Nybegynder
25. februar 2010 - 17:15 #2
metoder = funktioner? For hvis det er tilfældet forstår jeg det ikke
Avatar billede nicklasw Nybegynder
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
Avatar billede nicklasw Nybegynder
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]
Avatar billede nicklasw Nybegynder
25. februar 2010 - 17:21 #5
der er vist noget fejl i visning af kode på eksperten ;)
Avatar billede arne_v Ekspert
25. februar 2010 - 17:32 #6
metoder = funktioner i klasse

Er der nogle pure virtual metode i QLabel klassen som jeres klasse skal have?
Avatar billede nicklasw Nybegynder
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).
Avatar billede arne_v Ekspert
25. februar 2010 - 17:42 #8
Hvis QLabel klassen har en:

virtual void foobar() = 0;

saa skal din klasse have den foobar metode.
Avatar billede nicklasw Nybegynder
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?
Avatar billede nicklasw Nybegynder
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?
Avatar billede arne_v Ekspert
25. februar 2010 - 18:02 #11
Hvis du kan kave:

QLabel *x = new QLabel();

saa er det ikke det.
Avatar billede arne_v Ekspert
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.
Avatar billede arne_v Ekspert
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);
}
Avatar billede nicklasw Nybegynder
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
Avatar billede arne_v Ekspert
26. februar 2010 - 03:42 #15
Gerne, men har jeg hjulpet med noget ??
Avatar billede nicklasw Nybegynder
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
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester