Constructor cannot be redeclared - was mache ich falsch?

Seite 1 von 1 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/constructor-cannot-be-redeclared-was-mache-ich-falsch_247282/page_1 - zur Vollversion wechseln!


LTD schrieb am 05.10.2016 um 22:34

Abend,

ich muss mal wieder um Hilfe bitten, weil ich keine Ahnung habe, was ich bei diesem Code-Stück falsch mache:

Code: CPP
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!


wergor schrieb am 05.10.2016 um 23:22

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 schrieb am 06.10.2016 um 09:32

... 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){};

click to enlarge


wergor schrieb am 06.10.2016 um 12:02

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:

Code: CPP
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:
Code: CPP
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:
Code: CPP
automobil x("", "value for k");


LTD schrieb am 07.10.2016 um 15:27

Verstehe ich das so richtig: ich kann alles in dieser einen Zeile "zusammenfassen"?

automobil(int a = 0, string m = "", string k = ""){};


wergor schrieb am 07.10.2016 um 15:41

ja.


LTD schrieb am 09.10.2016 um 14:39

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);
}

hpp:
Code:
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:
Code:
Automat::Automat(unsigned long g, string s){
    set_geld(g);
    set_standort(s);
}

hpp:
Code:
 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 schrieb am 09.10.2016 um 14:57

Nur so noch als kleiner Tipp:

Der name Automata ist nicht vorteilhaft, wenn es bereits Automat gibt.
Macht den code schwer leserlich. :)


LTD schrieb am 09.10.2016 um 22:44

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);

Vielen Dank!


wergor schrieb am 09.10.2016 um 23:15

das meinte ich mit

Zitat von wergor
aber du musst auf die reihenfolge achten und darfst parameter nicht überspringen.
;)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025