Ist Operator richtig implementieren?
-
Ich glaube deine Probleme sind grundsaetzlicher Natur. Und deine Probleme fangen womoeglich an ganz anderer Stelle an. Die Map verwaltet ihre Objekte selbst. Aber was sind die Elemente der map? Sie sind vom Typ Figure* , d.h. sie verwaltet nur Pointer. Also kannst du ihnen auch nur Werte vom Typ Pointer auf Figure zuweisen. VFigure( *this ) erzeugt aber ein temporaeres Object vom Typ VFigure und ist eben kein Pointer (sofern VFigure( ... ) der Konstruktor fuer Objekte vom Typ VFigure ist).
-
Point_ schrieb:
New hat auch nichts gebracht! Ist auch nicht nötig denke ich da ja die map den Speicher selbst verwaltet.
Genau das ist der Punkt: Wir kennen die Klassen nicht. Wie auch, schließlich hast du sie geschrieben (zumindest gehe ich mal davon aus). Wenn du also mehr Code von deinen Klassen zeigen würdest, dann könnte man dir womöglich auch helfen und müsste nicht nur ins Blaue hinein raten.
-
Abstrakte Klasse:
class Gamehandler; class Figure { public: Figure(Gamehandler& game) :game_(game) { } virtual ~Figure(); virtual int getPart()const = 0; virtual void setPart()const =0; virtual int getMiddle() const = 0; virtual void setMiddle() const = 0; protected: Gamehandler& game_; private: Figure(const Figure&); };Davon Abgeleitet:
#include "figure.h" class VFigure :public Figure { public: VFigure(Gamehandler& game) :Figure(game) { } int getPart()const ; void setPart()const ; int getMiddle() const ; void setMiddle() const ; private: VFigure(const VFigure &); };Hab hier mal die wichtigsten sachen von den Headerfiles abgebildet hoffe das es jetzt klarer wird!
-
Und im Gamhandler hab ich die map definiert.
-
Naja, und jetzt nochmal die Zeile +/- Zeilen drueber und drunter, wo der Fehler auftritt. Auch solltest du wissen, dass einmal virtuell immer virtuell ist. Jemand, der aber nur VFigure benutzt, sieht sich nicht die Klasse Figure an. Er weiss also nicht, das getMiddle() virtuell ist. Besser man schreibt es vor jede virtuelle Funktion davor.
New hat auch nichts gebracht! Ist auch nicht nötig denke ich da ja die map den Speicher selbst verwaltet.
Des weiteren wuerde ich gern wissen, was bei diesem Versuch passiert ist. Wie z.B. die Fehlermeldung dort aussah.
-
Der Gamehandler
#include <map> #include "figure.h" class Gamehandler { public: Gamehandler(); virtual ~Gamehandler(); private: Gamehandler(const Gamehandler &); int b_; int h_; std::map<char,Figure*>figurelist_;Konstruktor vom Gamehandler
Gamehandler::Gamehandler() { figurelist_['v'] = new VFigure(*this); }Die Fehlermeldung:
Link erfolgt nicht inkrementell.
1>gamehandler.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: virtual __thiscall SepPreTris_::Figure::~Figure(void)" (??1Figure@SepPreTris_@@UAE@XZ)" in Funktion ""public: virtual void * __thiscall SepPreTris_::Figure::`scalar deleting destructor'(unsigned int)" (??_GFigure@SepPreTris_@@UAEPAXI@Z)".
-
Es ist auch noch so eine Regel, dass man einen virtuellen Destruktor anbieten sollte, wobei es kein muss ist. Ausser natuerlich, wenn du delete auf einen Basisklassenpointer (also Figure*) aufrufst. Biete doch einfach einen leeren, virtuellen Destruktor von VFigure (und auch von Figure) an.
-
Es fehlt VFigure::~VFigure
Und das war kein Kompilierfehler sondern ein Linkerfehler, ist was anderes.
-
Es scheint so, als ob er vergessen hätte den Destruktor von Figure zu definieren.
-
Jep das wars! Zwei verdammte Klammern!
