Parameter an Konstruktor weitergeben



  • Hallo,

    Ich habe eine Basisklasse (Vogel) und weitere Unterklassen (z.B Spatz), die von dieser Basisklasse erben.

    Nun habe ich die Variable m_color, die ich als Konstruktorargument erwarte:

    class Vogel {
      public:
        Vogel(string color = "blau") : m_color(color) {}
      private:
        string m_color;
    };
    
    class Spatz : public Vogel {
      public:
        Spatz(string color) {}
    };
    
    int main() {
      Spatz spatz = new Spatz("gruen"); // m_color wird immer "blau"!
      return 0;
    }
    

    Seht ihr vielleicht was ich falsch mache? Wenn ich dem Konstruktor von Vogel keien Standartwerte zuweise, meckert der Compiler, dass es diese braucht...



  • class Vogel {
      public:
        Vogel(string color = "blau") : m_color(color) {}
      private:
        string m_color;
    };
    
    class Spatz : public Vogel {
      public:
        Spatz(string color) : Vogel(color) {}
    };
    
    int main() {
      Spatz spatz("gruen");
      return 0;
    }
    


  • Auf den Ersten Blick würde ich sagen, dass du in Zeile 3 das = "blau" weglassen musst und die Konstruktoren sind falsch, der Spatz erbt ja vom Vogel. Dann müsste es funktionieren!



  • Du musst den Konstruktor von der Basis Klasse aufrufen:

    class Vogel {
      public:
        Vogel(string color) : m_color(color) {}
      private:
        string m_color;
    };
    
    class Spatz : public Vogel {
      public:
        Spatz(string color) : Vogel(color) {}
    };
    
    int main() {
      Spatz spatz = new Spatz("gruen"); // m_color wird immer "blau"!
      return 0;
    }
    

    Ausserdem würde ich den color Parameter als const std::string& übergeben.
    Gruss Simon



  • theta schrieb:

    Du musst den Konstruktor von der Basis Klasse aufrufen:

    class Vogel {
      public:
        Vogel(string color) : m_color(color) {}
      private:
        string m_color;
    };
    
    class Spatz : public Vogel {
      public:
        Spatz(string color) : Vogel(color) {}
    };
    
    int main() {
      Spatz spatz = new Spatz("gruen"); // m_color wird immer "blau"!
      return 0;
    }
    

    Ausserdem würde ich den color Parameter als const std::string& übergeben.
    Gruss Simon

    Danke für eure Antworten!

    Die Farbe übergebe ich sowieso als unsigned int, is ein Macro :p



  • Igitt! Kein Makro! Nimm stattdessen enum !

    class Vogel {
       enum color {
          red, green, blue ...
       };
    }
    
    ...
    
    Spatz* spatz = new Spatz(Vogel::red);
    


  • Ad aCTa schrieb:

    Igitt! Kein Makro! Nimm stattdessen enum !

    class Vogel {
       enum color {
          red, green, blue ...
       };
    }
    
    ...
    
    Spatz* spatz = new Spatz(Vogel::red);
    

    Ist das denn besser?

    Falls ja, wieso :o. Zum Beispiel windows.h benutzt doch auch Macros 😃



  • Ist das denn besser?

    Ja. Siehe z.B. hier:
    http://www.comeaucomputing.com/techtalk/#definevsconst

    Zum Beispiel windows.h benutzt doch auch Macros

    1. ist der besagte Header schon ziemlich alt und
    2. ist es ein C- Header

    Simon



  • Samyboy schrieb:

    Spatz spatz = new Spatz("gruen");
    

    Gibt es irgendeinen Grund, wieso du hier Speicher dynamisch allokierst? Gewöhne dir solche Dinge nicht an, vor allem nicht, ohne den Speicher wieder freizugeben!

    Ad aCTa schrieb:

    Igitt! Kein Makro! Nimm stattdessen enum !

    Sehr gute Idee. Man muss dann allerdings auch den Konstruktor anpassen, sonst verliert man wieder Typsicherheit.

    Spatz(Vogel::color col);
    

    Samyboy schrieb:

    Zum Beispiel windows.h benutzt doch auch Macros 😃

    Das ist ja mal ein Argument...


Anmelden zum Antworten