Unklare Fehlermeldung vom Linker
-
Hi!
Ich habe folgende Code geschrieben ( aufs nötigste reduziert ):
#ifndef _ENEMY_H_ #define _ENEMY_H_ #include <vector> #include "Block.h" #include "GameObject.h" using namespace std; class Enemy : public GameObject { public: Enemy(); virtual void update( int , int , vector<Block*>* ); }; #endif
#include "Enemy.h" Enemy::Enemy() : GameObject() { }
#ifndef _BLOODBALL_H_ #define _BLOODBALL_H_ #include <ClanLib/core.h> #include <ClanLib/display.h> #include <vector> #include "GameObject.h" #include "Collision.h" #include "Block.h" #include "Constants.h" #include "Enemy.h" using namespace std; class BloodBall : public Enemy { //hier stehen variablen die nicht wichtig sind für das Problem public: BloodBall( CL_Point* initial_pos , CL_ResourceManager* resource_manager ); void update( int vp_x , int vp_y , vector<Block*>* level_blocks ); }; #endif
Ausschnitt aus BloddBall.cpp
#include "BloodBall.h" BloodBall::BloodBall( CL_Point* initial_pos , CL_ResourceManager* resource_manager ) : Enemy() { // hier steht Code im Constructor }
Wenn ich das dann kompilieren will erhalte ich folgende Fehlermeldung, mit der ich leider nichts anfangen kann:
g++ -g `pkg-config --cflags clanGL-0.7 clanDisplay-0.7 clanCore-0.7 clanApp-0.7 clanSound-0.7 clanMikMod-0.7 clanVorbis-0.7` `sdl-config --cflags` -o Game Main.o Game.o LevelRenderer.o Player.o Level.o Block.o Collision.o GameObject.o BloodBall.o Enemy.o `pkg-config --libs clanGL-0.7 clanDisplay-0.7 clanCore-0.7 clanApp-0.7 clanSound-0.7 clanMikMod-0.7 clanVorbis-0.7` `sdl-config --libs` -lSDL_image BloodBall.o(.gnu.linkonce.r._ZTI9BloodBall+0x8): undefined reference to `typeinfo for Enemy' Enemy.o(.text+0x1d): In function `Enemy::Enemy[not-in-charge]()': LevelRenderer/Enemy.cpp:3: undefined reference to `vtable for Enemy' Enemy.o(.text+0x41): In function `Enemy::Enemy[in-charge]()': LevelRenderer/Enemy.cpp:3: undefined reference to `vtable for Enemy' collect2: ld returned 1 exit status make: *** [Game] Fehler 1
mfg
Tom
-
Okay ich habs jetzt gelöst. Auch wenn update in Enemy.h als virtual deklariere dann muss ich die Funktion trotzdem in Enemy.cpp defenieren. So sieht's dann aus:
#ifndef _ENEMY_H_ #define _ENEMY_H_ #include <vector> #include "Block.h" #include "GameObject.h" using namespace std; class Enemy : public GameObject { public: Enemy(); virtual void update( int , int , vector<Block*>* ) = 0; }; #endif
Enemy.cpp
#include "Enemy.h" Enemy::Enemy() : GameObject() { } void Enemy::update( int vp_x , int vp_y , vector<Block*>* blocks) { std::cout << "update aus enemy \n"; }
-
wenn du update() als echt virtuelle funktion deklarierst (also mit =0 dahinter), dann mußt du sie nicht für die klasse, in der sie deklariert ist, aber für alle abgeleiteten klassen definieren.
da du update() in Enemy in deinem ersten post noch nicht echt virtuell hattest, müßtest du dort eine funktion Enemy::update() definieren.
in deinem zweiten post hast du update() echt virtuell deklariert. dort mußt du BloodBall::update() definieren! also für die abgeleitete klasse.