Konstruktoren - So Sinnvoll?
-
Halli Hallo...
Hab in einem Online Tutorial eben das Thema Konstruktoren durchgenommen.Folgender Code is rausgekommen (Gekürzt, weiß nciht ob ihr sehr das das nur eingezogen ist, also auf diesen "-" Button geklickt)
//KRIEGER_CPP// #include "StdAfx.h" void Krieger::erzeuge(const char* name, int leben, int kraft, bool waffe, bool zustand, bool sex) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = waffe; bZustand = zustand; bSex = sex; } void Krieger::show_all() { cout <<"Name des Krieger: "<<chName <<"\n Leben des Kriegers: "<<iLeben <<"\n Kraft des Kriegers: "<<iKraft <<endl; if (bWaffe) { cout <<"Der Krieger hat eine Waffe!" <<endl; } else { cout <<"Der Krieger hat keine Waffe!" <<endl; } if(bSex) { cout <<"Es ist eine Frau" <<endl; } else { cout <<"Es ist ein Mann" <<endl; } } // KONSTRUKTOR // Krieger::Krieger(const char* name, int leben, int kraft, bool waffe, bool zustand, bool sex) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = waffe; bZustand = zustand; bSex = sex; } Krieger::Krieger(const char* name, int leben, int kraft, bool waffe, bool zustand) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = waffe; bZustand = zustand; bSex = true; } Krieger::Krieger(const char* name, int leben, int kraft, bool waffe) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = waffe; bZustand = true; bSex = true; } Krieger::Krieger(const char* name, int leben, int kraft) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = false; bZustand = true; bSex = true; } Krieger::Krieger(const char* name, int leben) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = 30; bWaffe = false; bZustand = true; bSex = true; } Krieger::Krieger(const char* name) { strncpy ( chName, name, sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = 30; iKraft = 30; bWaffe = false; bZustand = true; bSex = true; } Krieger::Krieger() { strncpy ( chName, "Aussenseiter" , sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = 30; iKraft = 30; bWaffe = false; bZustand = true; bSex = true; }
Hm, wow, er kopiert trotzdem den ganzen Code -.- Naja... Jedenfalls sieht mir das ziemlich unproffesionell aus, oder? Also für den Wissen-Stand bis Konstruktoren!
Oder ist das legitim, dass so zu machen?
-
strncpy ( chName, name, sizeof(chName) -1);
Hier hört man normalerweise auf, zu lesen.
Der Code ist nicht hübsch.
Statt der tausend Konstruktoren wären vielleicht Default-Parameter passender.
Statt char-Arrays sicherlich strings.
Die ungarische Notation war im vergangenen Jahrtausend modern, aber damals schon Quatsch.
Ich vermute, Du wolltest in C++-Forum und nicht nach C++/CLI, oder?
-
9A-91 schrieb:
Halli Hallo...
Hab in einem Online Tutorial eben das Thema Konstruktoren durchgenommen.
Folgender Code is rausgekommenFalls das Tutorial zu diesem Code führt, spiel mal mit dem Gedanken, es wegzumachen und ein anderes zu nehmen.
-
ups, ja wollte ich...
Ja, ungarische notation ist out, mach ich auch nicht mehr, aber um es flüssiger zu machen habe ich es so aus dem Tutorial übernommen.
Ja, mich hat es auch gewundert.. Vorallem kann ich so nicht sagen, das er zwar Leben hat, keine Waffe aber ein mann ist, da kein geeingneter Konstruktor vorhanden ist, da er ja nur 8 Möglichkeiten hat.
Wie wäre dein Lösungvorschlag nochma? Als Begriff, zum Googlen?!
-
9A-91 schrieb:
Wie wäre dein Lösungvorschlag nochma? Als Begriff, zum Googlen?!
Vor allem "YAGNI"!
Aber auch ein wenig "Default-Parameter".
-
Kann ich das schon lernen, oder brauch ich noch anderes, höheres Wissen dafür? Bin auf dem STand "Klassen, so olala, Vererbung geht noch Knapp, Funktionen eig ganz gut drauf bisher und den Wischiwaschi-For-While-Define-Krams kann ich auch...
-
9A-91 schrieb:
Kann ich das schon lernen, oder brauch ich noch anderes, höheres Wissen dafür?
Für YAGNI brauchst du überhaupt kein Vorwissen.
Werd dir erst einmal darüber klar, wie diese Klasse benutzt wird, und dann implementier nur die Konstruktoren, die du wirklich brauchst.
-
"YAGNI steht für “You Ain't Gonna Need It”, zu deutsch: „Du wirst es nicht brauchen“"
haha... Fettnäpfchen. Ja, aber wie löse ich den dann das Problemchen? Ich kann sogesehen ja 8*8 Möglichkeiten haben...
-
9A-91 schrieb:
Ich kann sogesehen ja 8*8 Möglichkeiten haben...
Kannst du. Aber hast du die wirklich?
YAGNI besagt, dass du dieser Klasse genau dann Konstruktoren verpasst, wenn du sie brauchst. So eine Klasse steht ja nicht allein auf der grünen Wiese, sie wird von anderem Code verwendet. Und werden da wirklich alle diese Kombinationen gebraucht? Oder vielleicht doch nur ein paar? Oder gibt es vielleicht noch gar keinen verwendenden Code? Dann schreib auch keine Konstruktoren.
-
Krieger::Krieger(const char* name=0, int leben=0, int kraft=0, bool waffe=true, bool zustand=true, bool sex=true) { if(name==0) name="Aussenseiter"; if(leben==0) leben=30; if(kraft==0) kraft=30; strncpy ( chName, name , sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = waffe; bZustand = zustand; bSex = sex; }
Leider gibt es für den bool keinen guten Wert, um Ungültigkeit zu markieren.
Und ich weiß nicht, ob 0 Leben oder 0 Stärke ungültig ist.Krieger::Krieger(const char* name=0, int leben=-1, int kraft=-1, int waffe=-1, int zustand=-1, int sex=-1) //Weglassen hat eh wenig Sinn. Defaultparameter dokumentieren nur die //jeweiligen ungültig-Werte { if(name==0) name="Aussenseiter"; if(leben==-1) leben=30; if(kraft==-1) kraft=30; if(waffe==-1) waffe=true; if(zustand==-1) zustand=true; if(sex==-1) sex=true;//??? strncpy ( chName, name , sizeof(chName) -1); chName[sizeof(chName)] = '\0'; iLeben = leben; iKraft = kraft; bWaffe = waffe; bZustand = zustand; bSex = sex; }
Da muß man aber wieder viel am Handbuch hängen, wenn man weiterprogrammiert, weil das ungewöhnlich ist.
Oder sowas wie TriBool oder Optional...
Aber irgendwie tentiere ich dazu, nur einen Kuntruktor zu wollen und nur eine Art des Aufrufs. Weder Default-Parameter noch Überladungen.
-
Ist jetzt vielleicht ein bisschen viel verlangt, aber könntest du mir vielleicht ein BSP zeigen? Hab mir das grad mal angeguckt mit den Default-parametern, aber wie wende ich das auf mein BSP an?
Aber musst du nicht... Mein Hund muss nur grad mal ne große Runde miit mir machen
und dann versuch ich mal "Default-Paramter" anzuwenden... Oder sollte ich vorher classen komplett lernen? Weil bei Polymorphie und Kopierkonstruktoren hörts bei mir auf...
-
9A-91 schrieb:
Ich kann sogesehen ja 8*8 Möglichkeiten haben...
Ich komme anders auf 64, nämlich jeder der 6 Parameter kann da sein oder weg, macht 2^6=64 Möglichkeiten.
9A-91 schrieb:
Ja, aber wie löse ich den dann das Problemchen?
Gar nicht!
BeachteKrieger::Krieger(int leben);
und
Krieger::Krieger(int kraft);
Die beiden kann der Compiler nicht unterscheiden.
Krieger hans(17);//welcher Konstruktor solls denn sein?
Und
Krieger hans("Hans",35,Krieger::DefaultKraft,true,true,false);
-
9A-91 schrieb:
Oder sollte ich vorher classen komplett lernen? Weil bei Polymorphie und Kopierkonstruktoren hörts bei mir auf...
Am besten, der Kopierkonstruktor nimmt auch strncpy, löl.
Erstmal viel mehr lesen (und wohl besser andere Quellen nehmen). Auch wenn beim ersten mal lesen nur 5% hängen bleibt, das macht nix. Du brauchst unbedingt mehr Übersicht, weniger Planlosigkeit, mehr Perspektiven.