LTD
frecher fratz
|
Abend, ich muss mal wieder um Hilfe bitten, weil ich keine Ahnung habe, was ich bei diesem Code-Stück falsch mache: class 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();
};
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. Vielen vielen Dank!
Bearbeitet von LTD am 09.10.2016, 22:44
|
wergor
connoisseur de mimi
|
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))
|
LTD
frecher fratz
|
... 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){};
|
wergor
connoisseur de mimi
|
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: automobil(string m, string k = "")
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: automobil(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: automobil x("", "value for k");
|
LTD
frecher fratz
|
Verstehe ich das so richtig: ich kann alles in dieser einen Zeile "zusammenfassen"?
automobil(int a = 0, string m = "", string k = ""){};
|
wergor
connoisseur de mimi
|
ja.
|
LTD
frecher fratz
|
Danke, habe es nun so gelöst: cpp: Automata::Automata(int a, string n, string m){
set_anzahl(a);
set_name(n);
set_marke(m);
}
hpp: Automata():Automata(0, "", ""){};
Automata(int, string, string);
Warum geht der Typ im Buch (Grundkurs C++) bei der Delegation von Konstruktoren eigentlich so vor, wenn die Methode nicht für mehr als 2 unterschiedliche Typen nutzbar ist?! cpp: Automat::Automat(unsigned long g, string s){
set_geld(g);
set_standort(s);
}
hpp: Automat():Automat(0, ""){};
Automat(string s):Automat(0L, s){};
Automat(unsigned long g):Automat(g, ""){}
Automat(unsigned long, string);
Vielen Dank mal wieder für eure Hilfe. lG
|
SailorChibi
Addicted
|
Nur so noch als kleiner Tipp: Der name Automata ist nicht vorteilhaft, wenn es bereits Automat gibt. Macht den code schwer leserlich.
|
LTD
frecher fratz
|
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: 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);
Vielen Dank!
|
wergor
connoisseur de mimi
|
das meinte ich mit aber du musst auf die reihenfolge achten und darfst parameter nicht überspringen.
|