"We are back" « oc.at

Constructor cannot be redeclared - was mache ich falsch?

LTD 05.10.2016 - 22:34 2843 9
Posts

LTD

frecher fratz
Avatar
Registered: Feb 2001
Location: is where it is
Posts: 6334
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!
Bearbeitet von LTD am 09.10.2016, 22:44

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
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
Avatar
Registered: Feb 2001
Location: is where it is
Posts: 6334
... 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

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
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

frecher fratz
Avatar
Registered: Feb 2001
Location: is where it is
Posts: 6334
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
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
ja.

LTD

frecher fratz
Avatar
Registered: Feb 2001
Location: is where it is
Posts: 6334
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

Addicted
Avatar
Registered: Aug 2010
Location: Wien
Posts: 382
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
Avatar
Registered: Feb 2001
Location: is where it is
Posts: 6334
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

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
das meinte ich mit
Zitat von wergor
aber du musst auf die reihenfolge achten und darfst parameter nicht überspringen.
;)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz