Inhalt von Methoden teilweise ersetzen?
-
Hi!
Folgende Situation:
class Auto { public: Auto(){ /*werte setzen*/}; int x,y,z; int baujahr; bool fahrbereit; bool siehtgutaus; string name; };
Das hab ich mir eben schnell ausgedacht. Von der Klasse Auto erben nun verschiedene Modelle, dass Problem ist nun das die sich nur vom Namen unterscheiden, der Rest ist immer gleich. Wenn ich jetzt die Konstrukten für die Modelle umschreibe muss ich ja alles was in der Klasse Auto schon initialisiert wurde nochmal mit hineinschreiben. Das finde ich nervig und umständlich. Gibt es nicht die Möglichkeit das ich sage:
class BMW { /*best. schlüsselwort */ Auto(){ name = "BMW"; }; };
Und jetzt behält der Konstruktor alle Inhalt des Auto Konstruktors, ersetzt nur den namen durch "BMW". ist soetwas möglich?
-
Hallo,
ja das ist moeglich und zwar musst du dazu dem CTor von 'Auto' einen
std::string-Parameter verpassen:class Auto { public: Auto(const std::string &autoName){ name = autoName; } int x,y,z; int baujahr; bool fahrbereit; bool siehtgutaus; string name; };
Und nun muss im CTor von BMW eben dieser entsprechend aufgerufen werden:
class BMW { public: BMW() : Auto("BMW") {} };
So sollte das funktionieren.
Du solltest dir allerdings angewoehnen, nicht alle Member public zu machen. Der
grosse Vorteil liegt z. B. darin, dass die Konkurrenz, z. B. VW, nicht einfach
hingehen kann und waehrend dem Fahren dem 3er BMW einen Reifen klaut.Ueber Memberfunktionen kannst du den Zugriff auf deine Objekte kontrollieren.
Schau dir nochmal das Thema Klassen in deinem Buch oder einem Tutorial an, ich
kann hier das Tutorial von Volkard oder Shade of Mine empfehlen, von denen ich
den Link leider grad nicht parat habe, aber wenn du suchst, solltest du
fuendig werden.mfg
v R
-
Technisch wäre die Lösung die Verwendung eines Initialisierungs-Konstruktors statt des Default-Ctors:
class Auto { public: Auto(int baujahr, bool fahrbereit, bool siehtGutAus, string name) : baujahr_(baujahr) , fahrbereit_(fahrbereit) , siehtGutAus_(siehtGutAus) , name_(name) {} private: 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") {} };
++ schrieb:
Von der Klasse Auto erben nun verschiedene Modelle
Bevor du weitermachts. Wieso erben die Modelle von Auto? Hat der Wert des Attributs "Hersteller" einfluss auf das Verhalten der Klasse? Wenn ja, in wieweit?
-
Also ich habe versucht das Prog von HumeSikkins zum Laufen zu bringen.
#include <iostream> #include <string> using namespace std; .................... Prog von HumeSikkins .................... int main() { BWM bmw; cout<<bmw.BMW(2004, true, true); return 0; };
Aber es kommt ne Fehlermeldung:
fatal error C1010: Unerwartetes Dateiende während der Suche nach der Direktive für die vorkompilierte HeaderdateiIch bin Anfänger!
-
....................
Prog von HumeSikkins
....................Das hast du aber nicht wirklich so im Quelltext stehen, oder? Wenn doch, dann
aendere es besser in folgendes ab:/*******************
Prog von HumeSikkins
*******************/mfg
v R
-
Mit
....................
Prog von HumeSikkins
....................meinte ich, dass es der Code von HumeSikkins ist!!
-
neWk schrieb:
Also ich habe versucht das Prog von HumeSikkins zum Laufen zu bringen.
#include <iostream> #include <string> using namespace std; .................... Prog von HumeSikkins .................... int main() { BWM bmw; cout<<bmw.BMW(2004, true, true); return 0; };
Aber es kommt ne Fehlermeldung:
fatal error C1010: Unerwartetes Dateiende während der Suche nach der Direktive für die vorkompilierte HeaderdateiIch bin Anfänger!
BMW hat keinen Default-Konstruktor.
-
interpreter schrieb:
neWk schrieb:
Also ich habe versucht das Prog von HumeSikkins zum Laufen zu bringen.
#include <iostream> #include <string> using namespace std; .................... Prog von HumeSikkins .................... int main() { BWM bmw; cout<<bmw.BMW(2004, true, true); return 0; };
Aber es kommt ne Fehlermeldung:
fatal error C1010: Unerwartetes Dateiende während der Suche nach der Direktive für die vorkompilierte HeaderdateiIch bin Anfänger!
BMW hat keinen Default-Konstruktor.
Hmmm...wie konnte mir das entgehen :(. Ich glaub ich lasse nach
mfg
v R
-
interpreter schrieb:
BMW hat keinen Default-Konstruktor.
Was meinst du? Stimmt was nicht mit der main Funktion?
-
Schon klar:
int main() { BMW(2004, true, true); return 0; };
-
Den letzten Parameter des BMW-Konstruktors kannst du dir sparen: Ein BMW sieht immer gut aus.
-
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(); }
-
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; };
-
reden wir immernoch über den code von HumeSikkins?
dann funkt das nicht, weil auto keinen def kontruktor hat
ausserdem weist du zuerst einer member variable einen wert zu, die dann wieder durch den def kontruktur auf einen def. wert gesetzt wird.muss heisen:
BWM () : Auto() { Auto::Auto(); name = "BMW"; }
-
ostream& operator<<(ostream& o, const BMW& bmw) {
o << bmw.baujahr << " " << bmw.siehtgutaus;
// usw
return o;
}
-
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