Oprettet tor. d. 25. februar 2010 kl. 17:00:30

nicklasw
nicklasw (10.482 point. Point ude: 430)

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

Skrevet tor. d. 25. februar 2010 kl. 17:11:14| #1

arne_v
arne_v (1.005.658 point)
Lidt googling antyder at fejlen skyldes at der mangler at blive defineret nogle metoder i bamse.cpp !

Skrevet tor. d. 25. februar 2010 kl. 17:15:42| #2

nicklasw
nicklasw (10.482 point)
metoder = funktioner? For hvis det er tilfældet forstår jeg det ikke

Skrevet tor. d. 25. februar 2010 kl. 17:17:53| #3

nicklasw
nicklasw (10.482 point)
Har lige tjekket det igen, alle funktioner der er defineret i header filen er også defineret i cpp filen

Skrevet tor. d. 25. februar 2010 kl. 17:20:04| #4

nicklasw
nicklasw (10.482 point)
den fulde cpp fil ser således ud:


#include &quot;bamse.h&quot;

bamse::~bamse()
{

}

bamse::bamse(void)
{
    this-&gt;H = 80;
    this-&gt;W = 80;

    this-&gt;GP_X = 0;
    this-&gt;GP_Y = 800;

    QImage Teddy_image;
    Teddy_image.load(&quot;Graphic/Teddy.gif&quot;);
    this-&gt;setPixmap(QPixmap::fromImage(Teddy_image));
  // this-&gt;setParent(parent);
    this-&gt;setGeometry(QRect(this-&gt;GP_X,this-&gt;GP_Y,this-&gt;H, this-&gt;W));
    this-&gt;show();


    //Load diverse andre Teddy-billeder
    Teddy_image_Go_Left_1.load(&quot;Graphic/Teddy_Go_Left_1.gif&quot;);

    Teddy_image_Go_Right_1.load(&quot;Graphic/Teddy_Go_Right_1.gif&quot;);
}

void bamse::Go_right()
{
    //Change global position variable
    this-&gt;GP_X++;

    //update teddy image
    this-&gt;setPixmap(QPixmap::fromImage(Teddy_image_Go_Right_1));

    //update teddy position
    this-&gt;setGeometry(QRect(this-&gt;GP_X,this-&gt;GP_Y,this-&gt;H, this-&gt;W));

}

void bamse::Go_left()
{
    //Change global position variable
    this-&gt;GP_X--;

    //update teddy image
    this-&gt;setPixmap(QPixmap::fromImage(Teddy_image_Go_Left_1));

    //update teddy position
    this-&gt;setGeometry(QRect(this-&gt;GP_X,this-&gt;GP_Y,this-&gt;H, this-&gt;W));

}

void bamse::Jump()
{
    //Change global position variable
    this-&gt;GP_Y += 50;

    //update teddy position
    this-&gt;setGeometry(QRect(this-&gt;GP_X,this-&gt;GP_Y,this-&gt;H, this-&gt;W));

}

void bamse::Go_down()
{

    if(!((this-&gt;GP_Y + 1 + this-&gt;H) &gt; 800))
    {
        //Change global position variable
        this-&gt;GP_Y--;

        //update teddy position
        this-&gt;setGeometry(QRect(this-&gt;GP_X,this-&gt;GP_Y,this-&gt;H, this-&gt;W));
    }

}


Skrevet tor. d. 25. februar 2010 kl. 17:21:15| #5

nicklasw
nicklasw (10.482 point)
der er vist noget fejl i visning af kode på eksperten ;)

Skrevet tor. d. 25. februar 2010 kl. 17:32:25| #6

arne_v
arne_v (1.005.658 point)
metoder = funktioner i klasse

Er der nogle pure virtual metode i QLabel klassen som jeres klasse skal have?

Skrevet tor. d. 25. februar 2010 kl. 17:36:50| #7

nicklasw
nicklasw (10.482 point)
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).

Skrevet tor. d. 25. februar 2010 kl. 17:42:55| #8

arne_v
arne_v (1.005.658 point)
Hvis QLabel klassen har en:

virtual void foobar() = 0;

saa skal din klasse have den foobar metode.

Skrevet tor. d. 25. februar 2010 kl. 17:46:37| #9

nicklasw
nicklasw (10.482 point)
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?

Skrevet tor. d. 25. februar 2010 kl. 17:56:07| #10

nicklasw
nicklasw (10.482 point)
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?

Skrevet tor. d. 25. februar 2010 kl. 18:02:57| #11

arne_v
arne_v (1.005.658 point)
Hvis du kan kave:

QLabel *x = new QLabel();

saa er det ikke det.

Skrevet tor. d. 25. februar 2010 kl. 18:04:01| #12

arne_v
arne_v (1.005.658 point)
Googling af den fejl i faar siger at det skyldes en manglende metode.

Jeg famler bare i moerke efter noget som passer med det.

Skrevet tor. d. 25. februar 2010 kl. 18:06:45| #13

arne_v
arne_v (1.005.658 point)
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);
}

Skrevet fre. d. 26. februar 2010 kl. 01:14:47| #14

nicklasw
nicklasw (10.482 point)
Har fundet ud af det... kommer med en forklaring imorgen... Tak for hjælpen arne_v du må godt ligge et svar

Skrevet fre. d. 26. februar 2010 kl. 03:42:32| #15

arne_v
arne_v (1.005.658 point)
Gerne, men har jeg hjulpet med noget ??

Skrevet fre. d. 26. februar 2010 kl. 14:18:34| #16

nicklasw
nicklasw (10.482 point)
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

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Regex sætning i C++

Oprettet den 30. januar 2012 kl. 22.55
kjeldsted giver 150 point for svar | Giv et svar »

Bog om strukturering

Oprettet den 25. januar 2012 kl. 07.26
keepy giver 30 point for svar | Giv et svar »

Opsnap keypress globalt.

Oprettet den 24. januar 2012 kl. 16.14
xited giver 200 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Her er fem sjove danske websider du skal kende

Trænger dine lattermuskler til en omgang fitness på dansk? Vi viser vej til fem websider fyldt med humor og vanvittig satire.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Nu kan du snart hente Windows 8

Den nye offentlige betaversion af Windows 8 er klar i denne måned.


Nyheder fra Computerworld

Teaser billede

Måske snart slut med Androids helt store problem

Android-platformen har længe været plaget af et særligt problem. Men måske er problemet nu ved at være elimineret.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger