rein virtuelle Funktion - Nicht aufgeloestes externes Symbol
-
gegeben:
class Position { // abstakte Klasse }; class Game { public: Game() : position(createPosition()) {} ~Game() { delete position; } virtual Position* createPosition() const =0; }; class TTTPosition : public Position { public: TTTPosition(); // nicht mehr abstakt }; class TTTGame : public Game { public: virtual Position* createPosition() const { return new TTTPosition; } };
warum kommt hier ein
Nicht aufgeloestes externes Symbol "public: virtual class Position * __thiscall Game::createPosition(void)const "), verwiesen in Funktion "public: __thiscall Game::Game(void)" ??
-
achja: Game:: private: Position* position;
noch ergänzen!
-
Weil du hier im Konstruktor von Game die NICHT implementierte Methode Game::createPosition aufrufst! Du musst sie also auch in der Klasse Game implementieren.
Deine beiden abgeleiteten Klassen sind hier vollkommen unwichtig.
-
d.h. ich muss folgendes machen?
TTTGame() : position(createPosition()) {}^geht aber nicht, weil position private ist.
-
Hallo,
ganz einfach, weil es Virtualität innerhalb von Konstruktoren nicht gibt.position(createPosition())
ist hier also gleichbedeutend mit:
position(Game::createPosition()). Du rufst hier also die nicht definierte rein virtuelle createPosition-Methode von Game auf.
-
Original erstellt von HumeSikkins:
**Hallo,
ganz einfach, weil es Virtualität innerhalb von Konstruktoren nicht gibt.position(createPosition())
ist hier also gleichbedeutend mit:
position(Game::createPosition()). Du rufst hier also die nicht definierte rein virtuelle createPosition-Methode von Game auf.**und wie löse ich das elegant?
-
class Position { // abstakte Klasse }; class Game { public: Game() {} ~Game() { delete position; } virtual Position* createPosition() const =0; private: Position* position; protected: set_position(Position * position ) { Game::position = position; } }; class TTTPosition : public Position { public: TTTPosition() { set_position(createPosition()); } // nicht mehr abstakt }; class TTTGame : public Game { public: virtual Position* createPosition() const { return new TTTPosition; } };
-
Danke Helium, aber ich hatte schon vorher die gleiche Idee .