stefan-tiger
31-05-2005, 14:10
Hallo, versuche grad ein simples Programm zu schreiben.
Es gibt eine Klasse "Koerper" und eine davon abgeleitete "Kreis".
Leider erhalte ich einen Linkerfehler:
bash-2.05b$ qmake -project && qmake && make && make clean && ./geo
g++ -c -pipe -Wall -W -march=athlon -O2 -pipe -DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -Isrc -I/usr/qt/3/include -o kreis.o src/kreis.cpp
g++ -c -pipe -Wall -W -march=athlon -O2 -pipe -DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -Isrc -I/usr/qt/3/include -o main.o src/main.cpp
g++ -o geo kreis.o main.o -L/usr/qt/3/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm
kreis.o(.text+0x128): In function `Kreis::~Kreis [not-in-charge]()':
: undefined reference to `vtable for Koerper'
kreis.o(.text+0x138): In function `Kreis::~Kreis [in-charge]()':
: undefined reference to `vtable for Koerper'
kreis.o(.text+0x148): In function `Kreis::~Kreis [in-charge deleting]()':
: undefined reference to `vtable for Koerper'
kreis.o(.gnu.linkonce.r._ZTI5Kreis+0x8): undefined reference to `typeinfo for Koerper'
collect2: ld returned 1 exit status
make: *** [geo] Fehler 1
Hier der Code:
koerper.h
#ifndef KOERPER_H
#define KOERPER_H
class Koerper
{
public:
Koerper() { id=0; }
Koerper(int ID) { id=ID; }
int GetID() { return id; }
virtual void definiere() {};
virtual double flaeche();
virtual double umfang();
virtual void zeichne();
virtual void bewege(double x, double y);
virtual ~Koerper() {}
protected:
int id;
} ;
#endif
kreis.h
#ifndef KREIS_H
#define KREIS_H
#include "koerper.h"
#include "point.h"
#define PI 3.14159265
class Kreis : public Koerper
{
public:
Kreis();
Kreis(Point p,double r);
void definiere(Point p,double r);
double flaeche();
double umfang();
double bogen(double alpha);
double sektor(double alpha);
void zeichne();
void bewege(double x, double y);
~Kreis();
private:
double radius;
Point koords;
} ;
#endif
kreis.cpp
#include "kreis.h"
#include <iostream>
using namespace std;
Kreis::Kreis()
{
koords = Point();
radius = 1;
}
Kreis::Kreis(Point p,double r)
{
koords = p;
radius = r;
}
Kreis::~Kreis()
{}
void Kreis::definiere(Point p,double r)
{
koords = p;
radius = r;
}
double Kreis::flaeche()
{
return (PI*radius*radius);
}
double Kreis::umfang()
{
return (PI*2*radius);
}
double Kreis::bogen(double alpha)
{
return (2*PI/360*alpha*radius);
}
double Kreis::sektor(double alpha)
{
return (PI/360*alpha*radius*radius);
}
void Kreis::zeichne()
{
cout << "zeichne Kreis x: " << koords.x << " y: " << koords.y << " Radius: " << radius << endl;
}
void Kreis::bewege(double x, double y)
{
koords.x+=x;
koords.y+=y;
}
Es gibt eine Klasse "Koerper" und eine davon abgeleitete "Kreis".
Leider erhalte ich einen Linkerfehler:
bash-2.05b$ qmake -project && qmake && make && make clean && ./geo
g++ -c -pipe -Wall -W -march=athlon -O2 -pipe -DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -Isrc -I/usr/qt/3/include -o kreis.o src/kreis.cpp
g++ -c -pipe -Wall -W -march=athlon -O2 -pipe -DQT_NO_DEBUG -I/usr/qt/3/mkspecs/linux-g++ -I. -I. -Isrc -I/usr/qt/3/include -o main.o src/main.cpp
g++ -o geo kreis.o main.o -L/usr/qt/3/lib -L/usr/X11R6/lib -lqt -lXext -lX11 -lm
kreis.o(.text+0x128): In function `Kreis::~Kreis [not-in-charge]()':
: undefined reference to `vtable for Koerper'
kreis.o(.text+0x138): In function `Kreis::~Kreis [in-charge]()':
: undefined reference to `vtable for Koerper'
kreis.o(.text+0x148): In function `Kreis::~Kreis [in-charge deleting]()':
: undefined reference to `vtable for Koerper'
kreis.o(.gnu.linkonce.r._ZTI5Kreis+0x8): undefined reference to `typeinfo for Koerper'
collect2: ld returned 1 exit status
make: *** [geo] Fehler 1
Hier der Code:
koerper.h
#ifndef KOERPER_H
#define KOERPER_H
class Koerper
{
public:
Koerper() { id=0; }
Koerper(int ID) { id=ID; }
int GetID() { return id; }
virtual void definiere() {};
virtual double flaeche();
virtual double umfang();
virtual void zeichne();
virtual void bewege(double x, double y);
virtual ~Koerper() {}
protected:
int id;
} ;
#endif
kreis.h
#ifndef KREIS_H
#define KREIS_H
#include "koerper.h"
#include "point.h"
#define PI 3.14159265
class Kreis : public Koerper
{
public:
Kreis();
Kreis(Point p,double r);
void definiere(Point p,double r);
double flaeche();
double umfang();
double bogen(double alpha);
double sektor(double alpha);
void zeichne();
void bewege(double x, double y);
~Kreis();
private:
double radius;
Point koords;
} ;
#endif
kreis.cpp
#include "kreis.h"
#include <iostream>
using namespace std;
Kreis::Kreis()
{
koords = Point();
radius = 1;
}
Kreis::Kreis(Point p,double r)
{
koords = p;
radius = r;
}
Kreis::~Kreis()
{}
void Kreis::definiere(Point p,double r)
{
koords = p;
radius = r;
}
double Kreis::flaeche()
{
return (PI*radius*radius);
}
double Kreis::umfang()
{
return (PI*2*radius);
}
double Kreis::bogen(double alpha)
{
return (2*PI/360*alpha*radius);
}
double Kreis::sektor(double alpha)
{
return (PI/360*alpha*radius*radius);
}
void Kreis::zeichne()
{
cout << "zeichne Kreis x: " << koords.x << " y: " << koords.y << " Radius: " << radius << endl;
}
void Kreis::bewege(double x, double y)
{
koords.x+=x;
koords.y+=y;
}