Problem bei Vererbung
-
Ich möchte eine Klasse Cursor von der Klasse Sprite Ableiten :
Sprite ist so definiert :
class Sprite { public: Sprite(SDL_Surface *new_image, int x, int y); void SetImage(SDL_Surface *new_image); void SetPos(int x, int y); void Move (int move_x, int move_y); SDL_Rect *GetRect(void); void Draw (SDL_Surface *target); protected: SDL_Surface *image; SDL_Rect rect; };
Cursor hab ich so definiert :
class Cursor : public Sprite { public: // class constructor Cursor(SDL_Surface *new_image, int x, int y); // class destructor ~Cursor(); };
So nun möchte ich, das Beim Aufruf des Konstruktors der Klasse Cursor, die Argumente an den Konstruktor der Basisklasse weitergegeben werden. Dies hab ich dann so geregelt :
Cursor::Cursor(SDL_Surface *new_image, int x, int y):Sprite(new_image,x,y) { }
Jetzt Meckert aber der compiler das alle Funktionen in der Sprite Klasse doppelt definiert sind. Warum ? Wenn dann doch nur der Konstruktor, die anderen hab ich gar nicht angerührt ?
Weiß jemand was da faul sein könnte
Danke
Tom
-
Ich fänd es interessant mal die genaue Compilermitteilung zu sehen. Irgendwie sehe ich nicht so wirklich nen Fehler, hab es nur mal überflogen.
Das einzige was mir sofort negativ ins Auge gestochen ist, war das Sprite keinen virtual D'tor hat. Sehr böse.
MfG
-
Sprite.cpp C:\Documents and Settings\sct\Desktop\MapEd\Sprite.o(.text+0x0) multiple definition of `Sprite::Sprite(SDL_Surface*, int, int)'
Die Meldung kriege ich für jede Funktion die in der Basisklasse implementiert ist. Der Destruktor ist blos momentan weg, weil ich dachte das er sich daran aufhängt, der kommt dann schon wieder rein
.
Ich wusste mir nur irgendiwe nicht mehr zu helfen und hab angefangen rumzuprobieren. Fummel jetzt schon den ganzen Tag daran rum.
-
Da der Konstruktor der Sprite klasse die gleichen Argumente übernehmen kann wie der der Cursor Klasse, braucht der Cursor Konstruktor doch eigentlich überhaupt keine Aktionen ausführen ( Cursor::Cursor() {} ) oder seh ich das falsch ? der Sprite Konstruktor wird doch so oder so mit den übergebenen Argumenten aufgerufen.. probier das mal aus...
-
Das dachte ich zuerst auch, aber dann kommt jedesmal das hier :
7 C:\Documents and Settings\sct\Desktop\MapEd\cursor.cpp no matching function for call to `Sprite::Sprite()'
Ich wollte den Konstruktor nämlich erst leer lassen.
-
Problem gelöst.
Ich hatte in der Main methode eine Variable deklariert die cursor hieß und mit der hat er sich gebissen. Wobei die Klein geschrieben war und die Klasse Groß aber wenn er meint der Compiler.
-
Könnte es sein das du keine Include Guards verwendest?
Das ist nämlich kein Compiler sondern ein Linker errorMfG