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 SimonDanke 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/#definevsconstZum Beispiel windows.h benutzt doch auch Macros
1. ist der besagte Header schon ziemlich alt und
2. ist es ein C- HeaderSimon
-
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...