URL: https://www.overclockers.at/coding-stuff/constructor-cannot-be-redeclared-was-mache-ich-falsch_247282/page_1 - zur Vollversion wechseln!
Abend,
ich muss mal wieder um Hilfe bitten, weil ich keine Ahnung habe, was ich bei diesem Code-Stück falsch mache:
Der fett gekennzeichnete Bereich im Code ist die Stelle, die mir X-Code ankreidet ... was ich nicht verstehe ist, dass es mit 2 Variablen (1 int, 1 string) super klappt, mit 3 jedoch nicht mehr. Habe ich da was falsch verstanden, oder wo liegt das Problem? Vielleicht kann mir da jemand helfen.Code: CPPclass automobil{ private: int anzahl = 0; string marke = ""; string klasse = ""; public: automobil():automobil(0L, "", ""){}; automobil(int a):automobil(a, "", ""){}; automobil(string m):automobil(0L, m, ""){}; [b]automobil(string k):automobil(0L, "", k){};[/b] automobil(int, string, string); void set_anzahl(int a); void set_marke(string m); void set_klasse(string k); void init(int a, string m, string k); int get_anzahl(); string get_marke(); string get_klasse(); };
ich erkenne zwar nicht mal die sprache, aber ich glaube dass der compiler keine möglichkeit hat zu erkennen welcher der beiden constructors aufzurufen ist, da die signatur gleich ist (automobil(string m) vs. automobil(string k))
... das ist c++ (11). Danke für deine Einschätzung. Das habe ich auch vermutet, wobei ja m statt k übergeben wird, aber gut -> wie sähe dann ein Konstruktor aus, der damit umgehen kann, dass ich eventuell nur einen String mit einem Wert füttere?
Das akzeptiert zwar XCode, aber wenn nun m oder k nicht eingegeben werden, fehlt doch ein Wert...:
automobil(string m, string k):automobil(0L, m, k){};
also doch c++. ich war verwirrt weil ich in c code noch nie einen constructor gesehen habe der einen anderen constructor derselben klasse aufruft.
c++ kennt default arguments ( http://en.cppreference.com/w/cpp/la...fault_arguments ), du könntest dann einen constructor so definieren:
das 2. argument wäre optional und würde, wenn du es nicht übergibst, auf "" gesetzt werden. das wäre auch für mehrere (oder alle) argumente einer funktion / constructor möglich:Code: CPPautomobil(string m, string k = "")
aber du musst auf die reihenfolge achten und darfst parameter nicht überspringen. wenn du nur k angeben willst, sähe der aufruf so aus:Code: CPPautomobil(string m = "", string k = "")
Code: CPPautomobil x("", "value for k");
Verstehe ich das so richtig: ich kann alles in dieser einen Zeile "zusammenfassen"?
automobil(int a = 0, string m = "", string k = ""){};
ja.
Danke, habe es nun so gelöst:
cpp:
Code:Automata::Automata(int a, string n, string m){ set_anzahl(a); set_name(n); set_marke(m); }
Code:Automata():Automata(0, "", ""){}; Automata(int, string, string);
Code:Automat::Automat(unsigned long g, string s){ set_geld(g); set_standort(s); }
Code:Automat():Automat(0, ""){}; Automat(string s):Automat(0L, s){}; Automat(unsigned long g):Automat(g, ""){} Automat(unsigned long, string);
Nur so noch als kleiner Tipp:
Der name Automata ist nicht vorteilhaft, wenn es bereits Automat gibt.
Macht den code schwer leserlich.
Solved!
Habe meinen Denkfehler gefunden: Die Argumente werden der Reihe nach eingelesen, es macht daher keinen Sinn, den 2. String abzufragen, wenn es keinen 1. gibt, da er dann ja automatisch an 1. Stelle steht. Daher fängt dieses Konstrukt alle eingaben ab:
Code:Automata():Automata(0, "", ""){}; Automata(int a):Automata(a, "", ""){}; Automata(string n):Automata(0L, n, ""){}; Automata(string n, string m):Automata(0L, n, m){}; Automata(int, string, string);
das meinte ich mit
Zitat von wergoraber du musst auf die reihenfolge achten und darfst parameter nicht überspringen.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025