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 🕶 .


Anmelden zum Antworten