Inhalt von Methoden teilweise ersetzen?
-
neWk schrieb:
Und wie gebe ich das jetzt aus?
int main() { BMW(2004, true, true); cout<<""; //Wie gebe ich das denn jetzt aus? Da soll: 2004 true true stehen. WAIT; return 0; };
da musst du den << operator überladen, müsste ja im forum genug posts dazu geben ( suchen )
-
Hi!
@neWk:
1. Solltest du ein Objekt erstellen und nicht nur den Konstruktor aufrufen:BMW my_BMW(2004, true, true);
2. Wenn du das ausgeben willst ging das auch vorher nicht. Ein Konstruktor hat keinen Rückgabewert, aber du könntest ja den <<-Operator überladen:
friend ostream& operator<<(ostream& ostr, const BMW& bmw_ausg) { return ostr << bmw_ausg.baujahr << ' ' << bmw_ausg.fahrbereit << ' ' << bmw_ausg.siehtgutaus; }
EDIT: zu spät.
Code-Hacker
-
btw finde ich diese Vererbungshierarchie nicht gut und ist imo eine übertriebene Spezialisierung. Warum nicht einfach so:
class Auto { // ... Hersteller hersteller; Typ typ; };
-
Code-Hacker schrieb:
Hi!
@neWk:
1. Solltest du ein Objekt erstellen und nicht nur den Konstruktor aufrufen:BMW my_BMW(2004, true, true);
2. Wenn du das ausgeben willst ging das auch vorher nicht. Ein Konstruktor hat keinen Rückgabewert, aber du könntest ja den <<-Operator überladen:
friend ostream& operator<<(ostream& ostr, const BMW& bmw_ausg) { return ostr << bmw_ausg.baujahr << ' ' << bmw_ausg.fahrbereit << ' ' << bmw_ausg.siehtgutaus; }
EDIT: zu spät.
Code-Hacker
Das friend keyword ist an dieser Stelle falsch.
-
DEvent schrieb:
BWM () : Auto() { Auto::Auto(); name = "BMW"; }
Wie wäre es denn einfach mit
BMW() { name = "BMW"; }
?
Auto muss nicht in der Initialisierungsliste erwähnt werden, weil es default-konstruiert wird, und "Auto::Auto()" macht sowieso nicht, was du willst.
-
Hi!
@interpreter:
Stimmt. Ich dachte die Elemente wären private.
Aber ne Begründung deiner Aussagen wäre manchmal nicht schlecht...Code-Hacker
-
SirLant schrieb:
Ich würd den Namen im Auto-Konstruktor gar nicht setzen und dann einfach in der BMW Klasse im Konstruktor folgendes machen
BMW() { name = "BMW"; Auto::Auto(); }
Stimmt das ich nicht eher darauf gekommen bin
.
Eine Frage noch dazu:Wieso wird der name nicht wieder überschrieben wenn man vor dem Konstruktor den namen setzt?
#include <string> #include <iostream> using namespace std; class Auto { public: Auto(); void LeseDaten(); int baujahr; int x,y,z; bool fahrbereit; bool siehtgutaus; string name; }; Auto::Auto() { baujahr = 2004; x = 0; y = 0; z = 0; fahrbereit = true; siehtgutaus = true; name = "default"; }; void Auto::LeseDaten() { cout<<"Baujahr : "<<baujahr<<endl; cout<<"X : "<<x<<endl; cout<<"Y : "<<y<<endl; cout<<"Z : "<<z<<endl; cout<<"Fahrbereit : "<<fahrbereit<<endl; cout<<"Sieht gut aus : "<<siehtgutaus<<endl; cout<<"Name : "<<name<<endl; }; class BMW : public Auto { public: BMW(){ name = "325i"; Auto::Auto(); }; }; int main() { BMW bmw; bmw.LeseDaten(); system("pause"); return(0); }
Ansonsten sollte das nur ein Beispiel sein, was besseres ist mir nicht eingefallen, hab da eben alles public gelassen man möge mir verzeihen
-
operator void schrieb:
DEvent schrieb:
BWM () : Auto() { Auto::Auto(); name = "BMW"; }
Wie wäre es denn einfach mit
BMW() { name = "BMW"; }
?
Auto muss nicht in der Initialisierungsliste erwähnt werden, weil es default-konstruiert wird, und "Auto::Auto()" macht sowieso nicht, was du willst.
Bis eben dachte ich, ich hätte es kapiert
Warum geht das denn so nicht?
-
Code-Hacker schrieb:
Hi!
@interpreter:
Stimmt. Ich dachte die Elemente wären private.Auch wenn sie privat gewesen wären, wäre friend hier falsch
friend darf nur in Klassen benutzt werden.Aber ne Begründung deiner Aussagen wäre manchmal nicht schlecht...
Ja. Sorry, bin heute etwas schlecht gelaunt
-
-
Ok, so ganz genau verstehe ich den Code noch nicht, aber das Problem besteht immer noch: Wie gebe ich das aus??
#include <iostream> #include <string> using namespace std; #define WAIT for(;;); class Auto { public: Auto(int baujahr, bool fahrbereit, bool siehtGutAus, string name) : baujahr(baujahr) , fahrbereit(fahrbereit) , siehtGutAus(siehtGutAus) , name(name) {} public: int baujahr; bool fahrbereit; bool siehtGutAus; string name; }; class BMW : public Auto { public: BMW(int baujahr, bool fahrbereit, bool siehtGutAus) : Auto(baujahr, fahrbereit, siehtGutAus, "BMW") {} friend ostream& operator<<(ostream& os,BMW& m); }; ostream& operator<<(ostream& o, const BMW& bmw) { return o << bmw.baujahr << " " << bmw.fahrbereit<<" "<<bmw.siehtGutAus; }; int main() { BMW my_BMW(2004, true, true); //wie gebe ich das jetzt aus??? WAIT; return 0; };
Was ist falsch daran?
-
Hi!
Das muss so aussehen, abgesehen davon müssen die Parameter auch immer gleich heißen:
class BMW : public Auto { public: BMW(int baujahr, bool fahrbereit, bool siehtGutAus) : Auto(baujahr, fahrbereit, siehtGutAus, "BMW") {} friend ostream& operator<<(ostream& os,BMW& bmw) { return o << bmw.baujahr << " " << bmw.fahrbereit<<" "<<bmw.siehtGutAus; } };
Code-Hacker
-
cout << my_BMW;
Nebenbei: Die Signatur deines operator<< stimmt nicht mit der Signatur der als friend deklarierten Funktion überein.
-
Code-Hacker schrieb:
Hi!
Das muss so aussehen, abgesehen davon müssen die Parameter auch immer gleich heißen:
Was genau meinst du damit?
-
Juhu, danke.
Habe eben das auch herausgefunden. Die friend funktion war nicht nötig.!!
-
Hi!
@interpreter:
Damit meine ich das er beim Operator IN der klasse, also bei der Deklaration andere Parameterbezeichner verwende hat, als in der definition, ansonsten ginge das:class BMW : public Auto { public: BMW(int baujahr, bool fahrbereit, bool siehtGutAus) : Auto(baujahr, fahrbereit, siehtGutAus, "BMW") {} friend ostream& operator<<(ostream&, const BMW&); /* muss hier nicht deklariert sein es sei denn es soll auf private Member zugegriffen werden können */ }; ostream& operator<<(ostream& os, const BMW& m) { return os << m.baujahr << " " << m.fahrbereit<<" "<<m.siehtGutAus; };
Naja, ich habe gleich noch was dazu gelernt, was Operatoren betrifft. Nämlich wo man sie wie deklarieren/definieren muss/kann.
Code-Hacker
-
Code-Hacker schrieb:
Hi!
@interpreter:
Damit meine ich das er beim Operator IN der klasse, also bei der Deklaration andere Parameterbezeichner verwende hat, als in der definition, ansonsten ginge dasDas ist auch in Ordnung. Für den Compiler ist nur der Typ entscheidend.
-
Hi!
Oh stimmt. Aber ich sehe wo sein Fehler war. Er hat einmal const und einmal nicht const angegeben. Sollte in beiden Fällen const sein.
Code-Hacker
-
sdfgsdfg schrieb:
SirLant schrieb:
Ich würd den Namen im Auto-Konstruktor gar nicht setzen und dann einfach in der BMW Klasse im Konstruktor folgendes machen
BMW() { name = "BMW"; Auto::Auto(); }
Stimmt das ich nicht eher darauf gekommen bin
.
Eine Frage noch dazu:Wieso wird der name nicht wieder überschrieben wenn man vor dem Konstruktor den namen setzt?
#include <string> #include <iostream> using namespace std; class Auto { public: Auto(); void LeseDaten(); int baujahr; int x,y,z; bool fahrbereit; bool siehtgutaus; string name; }; Auto::Auto() { baujahr = 2004; x = 0; y = 0; z = 0; fahrbereit = true; siehtgutaus = true; name = "default"; }; void Auto::LeseDaten() { cout<<"Baujahr : "<<baujahr<<endl; cout<<"X : "<<x<<endl; cout<<"Y : "<<y<<endl; cout<<"Z : "<<z<<endl; cout<<"Fahrbereit : "<<fahrbereit<<endl; cout<<"Sieht gut aus : "<<siehtgutaus<<endl; cout<<"Name : "<<name<<endl; }; class BMW : public Auto { public: BMW(){ name = "325i"; Auto::Auto(); }; }; int main() { BMW bmw; bmw.LeseDaten(); system("pause"); return(0); }
Ansonsten sollte das nur ein Beispiel sein, was besseres ist mir nicht eingefallen, hab da eben alles public gelassen man möge mir verzeihen
Weiß wer von euch darauf die Antwort? Ist mir auch schleierhaft, nen paar Tests
haben gezeigt, dass Auto::Auto() zu beginn von BMW::BMW() aufgerufen wird, dann
der Namen geändert und dann wird wieder Auto::Auto() aufgerufen wo der Namen ja
auf "default" geändert wird.Ich dachte bei meinem Posting eigentlich daran, dass du in Auto::Auto() den
Namen nicht setzt, deswegen wundert es mich umso mehr, dass es so auch geht
-
Code-Hacker schrieb:
Hi!
Oh stimmt. Aber ich sehe wo sein Fehler war. Er hat einmal const und einmal nicht const angegeben. Sollte in beiden Fällen const sein.
interpreter schrieb:
Nebenbei: Die Signatur deines operator<< stimmt nicht mit der Signatur der als friend deklarierten Funktion überein.