Frage zu diesen Klassen:
-
Hier kommt meine Klasse mit einer klasse die erbt!
Shconmal vorweg...diese Klasse hat keinen Sinn, nur zum üben!!!!
Fehler des Compilers führe ich unten auf, bei fragen im Code mach ich Kommentar!
class Hund { public: Hund(int alter=10,char* _name="default"); void bellen(){cout<<"wuff"<<endl;} int GetAlter(); void GetName(); ~Hund(); private: int jahre; char* name; }; class Windhund:public Hund { public: Windhund(int alter=10,char* _name="default",int a,int b); //wie kann ich hier eine Initialisierungsliste für a=augen und b=beine benutzen?? int GetBeine(); int GetAugen(); ~Windhund(); private: int beine; int augen; }; Hund::Hund(int alter,char* _name) { name= new char[20]; strcpy(name,_name); jahre=alter; } int Hund::GetAlter() { return jahre; } void Hund::GetName() { cout<<name<<endl; } Hund::~Hund() { delete[] name; //Desktruktor so i.o? } Windhund::Windhund(int alter,char* _name,int a,int b):Hund() //ist der Konstruktor der Baseklasse so richtig initialisiert? { name=new char[20]; strcpy(name,_name); jahre=alter; } int Windhund::GetAugen() { return augen; } int Windhund::GetBeine() { return beine; } Windhund::~Windhund() { delete[] name; }
Und nun Fehlermeldungen:
[C++ Fehler] Unit1.cpp(28): E2260 Vorgabewerte für nachfolgende Parameter '_name' fehlen [C++ Fehler] Unit1.cpp(57): E2247 Zugriff auf 'Hund::name' nicht möglich [C++ Fehler] Unit1.cpp(57): E2247 Zugriff auf 'Hund::name' nicht möglich [C++ Fehler] Unit1.cpp(58): E2247 Zugriff auf 'Hund::name' nicht möglich [C++ Fehler] Unit1.cpp(58): E2247 Zugriff auf 'Hund::name' nicht möglich [C++ Fehler] Unit1.cpp(59): E2247 Zugriff auf 'Hund::jahre' nicht möglich [C++ Fehler] Unit1.cpp(59): E2247 Zugriff auf 'Hund::jahre' nicht möglich [C++ Fehler] Unit1.cpp(71): E2247 Zugriff auf 'Hund::name' nicht möglich [C++ Fehler] Unit1.cpp(71): E2247 Zugriff auf 'Hund::name' nicht möglich
hoffe meine fragen kann jemand beantworten,und mir sagen, wo die fehler liegen!?
Sollte sonst irgendetwas auszusetzten sein, einfach sagen!
-
Wenn du uns schon ne halbe Seite Quellcode hinschmeißt mit Fehlermeldungen, dann markier mal, auf welche Zeilen diese Meldungen sich beziehen. Zeilen zählen tu ich nicht gern. Abegesehen davon lassen sich diene Probleme auch mit Nachschlagen in einem Buch lösen.
Und ließ dir mal http://www.lugbz.org/documents/smart-questions_de.html durch.
Schau dir mal das an und denk darüber nach, das sollte schon mal weiter helfen.
class foo { public: foo(int x, const char* c); }; foo::foo(int x = 5, const char* c = "bar") { std::cout << x << " " << c << std::endl; } int main() { foo(); foo(5); foo(7,"foobar"); return 0; }
-
Warum soll er denn die Zeilen markieren? Man kann auch die Fehlermeldung so lesen und weiß was los ist. Er versucht außerhalb von Hund auf ein privates Member zu zugreifen. Das geht natürlich nicht.
Schreib dir mal zu den Members noch setter-Methoden.
#include <string> class Hund { public: Hund(int alter=10,std::string name); int getAlter() { return alter; } void setAlter(int jahre) { alter = jahre; }; ~Hund(); private: int alter; // Jahre ist nicht passend zu den getter/setter std::string name; // char* ist böse. Benutze lieber die string-Klasse };
Es wäre aber besser, wenn das Member so heißen würde wie die Getter/Setter.
So, jetzt kannst du das Alter mit der setAlter()-Methode setzen.
Hund::Hund(int alter,std::string name) { setName(name); setAlter(alter); } Windhund::Windhund(int alter, std::string name, int augen, int beine) : Hund(alter, name) { this->augen = augen; this->beine = beine; }
-
also dein code war wohl auf das bezogen?
Hund::Hund(int alter,char* _name) { name= new char[20]; strcpy(name,_name); jahre=alter; }
den rest sag ich dir dann!
-
Taurin schrieb:
Wenn du uns schon ne halbe Seite Quellcode hinschmeißt mit Fehlermeldungen, dann markier mal, auf welche Zeilen diese Meldungen sich beziehen.
Wenn du nichtmal die 5 Sekunden Zeit hast, um den Quellcode zu überfliegen und die in Kommentare eingebetteten Fragen zu sehen -- es braucht übrigens auch kein übermenschliches Genie, um die Stelle zu finden, an der es mit dem Defaultargument _name ein Problem gibt -- woher nimmst du dann die Zeit, ihn für seine vermeintlichen Verfehlungen zurechtzuweisen?
(1)
[C++ Fehler] Unit1.cpp(28): E2260 Vorgabewerte für nachfolgende Parameter '_name' fehlen
Dazu der Code:
Windhund(int alter=10,char* _name="default",int a,int b);
Pflichtargumente müssen links stehen, optionale Argumente mit Defaultwerten rechts. Wenn man einen WindHund so konstruiert:
Windhund h;
woher soll der Compiler a und b wissen? Andererseits, wie willst du a und b angeben, wenn du alter und _name wegläßt?
(2)
Hund::name und Hund::jahre sind private und damit in keiner anderen Klasse als in Hund sichtbar. Vielleicht willst du sie protected machen. Obwohl das generell auch kein guter Stil ist, alles was an public-Variablen schlecht ist, ist auch an protected-Variablen schlecht.(3)
delete[] name; //Desktruktor so i.o?
Ja, an sich schon. Das einzige Problem hier liegt im Konstruktor. name wird nur mit 20 Zeichen veranschlagt, was natürlich zu Problemen führt, wenn ein Name mal länger ist.
(4)
Windhund::Windhund(int alter,char* _name,int a,int b):Hund() //ist der Konstruktor der Baseklasse so richtig initialisiert?
Das ist überflüssig, weil der Konstruktor der Basisklasse sowieso aufgerufen wird. Man macht das nur, wenn man Argumente übergeben will. Und das solltest du hier auch tun:
Windhund::Windhund(int alter, char *_name, int a, int b) : Hund(alter, _name) { augen = a; beine = b; }
Das name-Feld der Basisklasse solltest du weder hier noch im Destruktor manipulieren, das ist Sache der Basisklasse, nicht die von Windhund.
-
Uhh.....
Also wie würde eurer meinung nach der Konstruktor der 2 Klassen am besten aussehen?
Bin jetzt schon bissl verwirrt!
Zusatzfrage immernoch: wie bekomm ich im Konstruktor der Windhundklasse eine Initialisierungsliste hin?
-
Würde mich über ein beispiel sehr freuen, wenn ich mir, anscheinend vergebens, den kopf darüber zerbreche!
-
Klassenanfänger schrieb:
Uhh.....
Also wie würde eurer meinung nach der Konstruktor der 2 Klassen am besten aussehen?
Hund::Hund(int alter, const char* _name) : alter(alter) { int length = strlen(_name); name = new char[length+1]; strcpy(name, _name); } Windhund::Windhund(int alter, const char* _name, int augen, int beine) : Hund(alter, _name), a(augen), b(beine) { }
Sogar inklusive Initialisiererliste.
-
AHH DANKE
War ich ja schon relativ nah dran...ich danke dir!