Vererbung und konstruktoren ??



  • Hallo
    ich habe hier ein keine Problem, wobei ich Hilfe gebrauchen könnte ^^
    als ich habe eine Basisklasse, die Koordinaten enthält (X,Y) und die so ausschaut:

    class Koordinaten
    {
     public:
     Koordinaten(unsigned char _posX, unsigned char _posY)
     :posX(_posX)
     ,posY(_posY)
     {}     
    
     unsigned char getPosX() const {return posX;}
     unsigned char getPosY() const {return posY;}  
    
     protected:
     unsigned char posX,
                   posY;
    };
    

    nun will ich von dieser klass erben und habe es so gemacht:

    class Spieler : Koordinaten
    {
      public:
      Spieler(unsigned char _posX, unsigned char _posY)
      :posX(_posX)
      ,posY(_posY)
      {}
    
      Spieler(){}  
    
      ... 
    
    };
    

    der kompiler "schmeist" mir aber eine Fehlermeldung an den Kopf: "class `Spieler' does not have any field named `posX' " -> und das kann ich nicht verstehen -> ich erbe doch von meiner Koordinaten Klasse 😕

    Wie muss ich das anstellen?

    MFg



  • Der Spieler-Ctor darf nur die eigenen Member der Klasse direkt initialisieren - und die Initialisierung der Basis-Member an den Basis-Ctor weiterleiten:

    class Spieler : public/*??*/ Koordinaten
    {
      public:
      Spieler(unsigned char _posX, unsigned char _posY)
      : Koordinaten(_posX,_posY)
      {}
    };
    


  • Ahh vielen Dank, ich wusste doch das man das irgendwie so machen musste -> wusste aber eben nicht mehrgenau wie das ging ^^



  • Rainu schrieb:

    nun will ich von dieser klass erben und habe es so gemacht:

    class Spieler : Koordinaten

    Es ist von Design-Standpunkt her vermutlich Quatsch, das überhaupt zu tun. (Öffentliche) Vererbung drückt eine "ist ein"-Beziehung aus. In deinem Design ist also ein Spieler ein Koordinatenpaar. So etwas sollte man besser durch eine "hat ein"-Beziehung ausdrücken (also der Spieler-Klasse einen Koordinaten-Member verpassen).



  • class coord
    {
        unsigned char m_x;
        unsigned char m_y;
    
    public:
        coord(unsigned char x, unsigned char y)
            : m_x(x), m_y(y)
        {}
    
    public:
        unsigned char get_x() const { return m_x; }
        unsigned char get_y() const { return m_y; }  
    };
    
    class player
    {
        coord m_pos;
        std::string m_name;
    
    public:
        player(std::string const& name, coord const& pos) 
            : m_name(name), m_pos(pos)
        {}
    };
    

    wäre logischer ...


Log in to reply