Frage zu vererbung
-
Also du übergibst an den Konstruktor von Fahrrad ein einzelnes int Argument und übergibst dann in der Element-Initialisierungsliste an den Konstruktor der Basisklasse 3 weitere Argumente. Wo soll er die denn hernehmen, dass versteh ich grade nicht so wirklich?
Vielleicht probiert er die eigenen Elemente, die ja genauso heißen zu nehmen und zu initialisieren, da diese aber uninitialisiert sind, erhälst du ein undefiniertes Verhalten.
Ist aber nur ne reine Vermutung.
Probier mal die Namen der Argumente zu ändern, und schau was dann passiert...erhälst du dann vielleicht einen Compiler-Fehler?
Lg freeG
EDIT: Ha wir haben die gleiche Vermutung

@Threadersteller:
Und gewöhn dir das echt mit der Element-Initialisierungsliste an und nehm andere Namen, nicht die gleichen, denn falls das wirklich der Fehler ist was wir vermuten, dann hätte dir dass diese Fehlersuche erspart, da der Compiler dir dann nen Fehler ausgespuckt hätte.
-
ok, hab mal das draus gemacht:
Fahrrad::Fahrrad(int rahmengroesse) : Fahrzeug(anzahl_sitzplaetze, kW, farbe){ this->rahmengroesse = rahmengroesse; this->anzahl_sitzplaetze = anzahl_sitzplaetze; this->kW = kW; this->farbe = farbe; }Also den ganzen müll auch initialisiert.
leider wieder gleicher fehler.
-
buzz_lightzyear schrieb:
ok, hab mal das draus gemacht:
Fahrrad::Fahrrad(int rahmengroesse) : Fahrzeug(anzahl_sitzplaetze, kW, farbe){ this->rahmengroesse = rahmengroesse; this->anzahl_sitzplaetze = anzahl_sitzplaetze; this->kW = kW; this->farbe = farbe; }Also den ganzen müll auch initialisiert.
leider wieder gleicher fehler.Ok da hab ich mal ne Frage.....
Wie oder mit was lernst du C++?Hol dir am bestein ein anständiges C++ Grundlagenbuch.
Und ließt du dir eigentlich nicht durch was wir schreiben, du musst an deinen Fahrrad-Konstruktor ja erst mal Argumente übergeben und umgenannt hast du die Parameter zu dem auch nicht....

Schau mal, dass was du jetzt in den Konstruktorrumpf eingefügt hast bewirkt erst mal gar nichts, da dein Fehler ja schon vorher auftritt. Genau diesen Schritt den du jetzt manuell in den Konstruktorrumpf eingefügt hast, geschieht doch schon im Rumpf von Fahrzeug-Konstruktor, wobei es auch dort in die Element-Initialisierungsliste gehört.
Lg freeG
-
cool down... hab erst jetzt dein edit gesehen...
-
buzz_lightzyear schrieb:
Fahrrad::Fahrrad(int rahmengroesse) : Fahrzeug(anzahl_sitzplaetze, kW, farbe){Also den ganzen müll auch initialisiert.
leider wieder gleicher fehler.An dieser Stelle ist farbe ja auch noch uninitialisiert und wird dann kopiert.
Du brauchst konkrete Werte bzw. initialisierte Variablen:
Fahrrad::Fahrrad(int rahmengroesse) : Fahrzeug(1, 0, ""){
-
Fahrzeug::Fahrzeug( int seats, int power, std::string color ): anzahl_sitzplaetze( seats), kw( power ), farbe( color ) { } Fahrrad::Fahrrad( int seats, int power, std::string color, int size ): Fahrzeug( seats, power, color ), rahmengroeße( size ) { } Fahrrad objekt( 5, 100, "Red", 20 );So müsste dass ungefährt aussehen.
Dein Code würde gar nicht funktionieren, da du die Argumente die du im Konstruktor von Fahrrad an Fahrzeug übergibst gar nicht vorhanden sind, sie sind bei dir nur durch Zufall da, da sie die gleichen Namen haben wie deine Datenelemente. So nun will er mit deine uninitialisierten Datenelementen eben genau diese initialisieren.
Und genau das gibt wohl den Fehler.Verstehst dus
?Lg freeG
-
yeah:
neuer output:
134517465
-1218325724
gg
-
Post mal bitte deine beiden Klassen, sprich Header und Quelldatei und deien main.
Alles auf dem jetzigen Stand.
Lg freeG
-
schon wieder ein post übersehen...omg... was sind das bitte für sinnbefreite tutorials auf die ich da stosse? das hab ich ja komplett anders gemacht. ich probiers nochmal dann melde ich wieder.
-
fr33g schrieb:
Fahrzeug::Fahrzeug( int seats, int power, std::string color ): anzahl_sitzplaetze( seats), kw( power ), farbe( color ) { } // hm... ok, das Fahrzeug::Fahrzeug ist der konstruktor von der Klasse Fahrzeug... was ist dann das: anzahl_sitzplaetze( seats), kw( power ), farbe( color ) //???? Fahrrad::Fahrrad( int seats, int power, std::string color, int size ): Fahrzeug( seats, power, color ), rahmengroeße( size ) { } Fahrrad objekt( 5, 100, "Red", 20 );So müsste dass ungefährt aussehen.
Dein Code würde gar nicht funktionieren, da du die Argumente die du im Konstruktor von Fahrrad an Fahrzeug übergibst gar nicht vorhanden sind, sie sind bei dir nur durch Zufall da, da sie die gleichen Namen haben wie deine Datenelemente. So nun will er mit deine uninitialisierten Datenelementen eben genau diese initialisieren.
Und genau das gibt wohl den Fehler.Verstehst dus
?Lg freeG
also auf diese weise hab ich das noch nie gesehen!
-
buzz_lightzyear schrieb:
fr33g schrieb:
Fahrzeug::Fahrzeug( int seats, int power, std::string color ): anzahl_sitzplaetze( seats), kw( power ), farbe( color ) { } // hm... ok, das Fahrzeug::Fahrzeug ist der konstruktor von der Klasse Fahrzeug... was ist dann das: anzahl_sitzplaetze( seats), kw( power ), farbe( color ) //???? Fahrrad::Fahrrad( int seats, int power, std::string color, int size ): Fahrzeug( seats, power, color ), rahmengroeße( size ) { } Fahrrad objekt( 5, 100, "Red", 20 );So müsste dass ungefährt aussehen.
Dein Code würde gar nicht funktionieren, da du die Argumente die du im Konstruktor von Fahrrad an Fahrzeug übergibst gar nicht vorhanden sind, sie sind bei dir nur durch Zufall da, da sie die gleichen Namen haben wie deine Datenelemente. So nun will er mit deine uninitialisierten Datenelementen eben genau diese initialisieren.
Und genau das gibt wohl den Fehler.Verstehst dus
?Lg freeG
also auf diese weise hab ich das noch nie gesehen!
Ja die Elemente werden initialisiert. Das ganze nennt sich Elementinitialisierungsliste.
Wenn du die Elemente erst im Konstruktorrumpf "initialisierst" initialisierst du sie gar nicht, dass ist dann nur eine Zuweisung, da dann bei string zum Beispiel der Standardkonstruktor ausgeführt wird, die int Elemente bleiben uninitialisiert.Das ist aber nicht direkt das Problem bei dir sondern eben dass du deinem Fahrzeug keine Argumente für den Basisteil übergeben hast. Und wie gesagt das wär normal ein Compiler-Fehler, blos da du die Namen für die Argumente gleich mit den Namen der Datenelemente hat, setzt er als Argumente die unitialisierten Datenelemente ein und die sollen dann die Datenelemente initialisieren.
Genau so dumm und unlogisch wie sich der Satz anhört ist es auch

Also nochmal:
-Nutze die Element-Initialisierungsliste
-Nehm für Parameter andere Namen als für Datenmember
-Übergib dem Fahrrad Argumente, welche du dann auch dem Farhzeug gibst
-Les ein anständiges C++ Grundlagenbuch wenn du dich wirklich mit C++ beschäftigen willst;)Ansonsten:
Post nochmal Headerdateien samt Quelldateien der Klassen und die main.Ob ichs allerdings heut noch les weiß ich nicht, da ich gleich schlafen geh

Lg freeG
-
Wenn du
std::string colorin beiden Konstruktoren durch
const std::string& colorersetzt, ist es (wie ich denke) eine saubere Lösung von fr33g.
Diese Änderung verhindert unnötige zusätzliche Kopien.
Ob du jetzt z.B. Sitze=1 implizierst (stimmt bei Tandem natürlich nicht) und
deswegen nicht als Parameter übergibst, ist wohl Geschmacksache.Natürlich kannst du auch mehrere Konstruktoren machen, damit du beide Optionen hast.
-
Ja da geb ich dir Recht, mach normal auch immer const std::string&, aber hab da gestern abend au net mehr dran gedacht
, war wohl zu müde:-P.Aber mich würd jetzt mal interessieren ob er es hinbekommen hat oder nicht?
Lg freeG
-
Nein funktioniert nicht. Ich hab keine Ahnung was ihr da für eine Micky-Maus kacke reinpostet. Naja, die Qualität des Forums lasst halt auch nach.
lg
-
buzz_lightzyear schrieb:
Nein funktioniert nicht. Ich hab keine Ahnung was ihr da für eine Micky-Maus kacke reinpostet. Naja, die Qualität des Forums lasst halt auch nach.
Ja, und zwar in erster Linie wegen Leuten wie dir. Was erwartest du, wenn du nicht einmal fähig bist, nach mehrfacher Aufforderung ein vollständiges Minimalbeispiel zu posten?
Wenn du schon keine Eigeninitiative mitbringst, sondern nur ohne zu denken Code kopierst, kannst du wenigstens so freundlich sein, dich nicht über die gutgemeinte Hilfe auszulassen. Selbst wenn dir die Antworten von fr33g und XSpille nicht passen, enthalten sie einige gute Ratschläge. Aber du scheinst sie ja nicht einmal richtig gelesen zu haben.
Sorry, aber sowas kannst du hier echt nicht bringen.

-
naja, wenn du als gut gemeinte Hilfe diese MMK meinst, ist das anscheindend dein erster beitrag den du liest. Schade um die Zeit die ich damit verschwendet habe. Ich meine, ich gebe keine Antworten auf beträge bei denen ich mich selbst nicht auskenne. Und dann immer diese Halb-Antworten, die einen noch mehr in die irre führen... herrlich.
bL
-
buzz_lightzyear schrieb:
naja, wenn du als gut gemeinte Hilfe diese MMK meinst, ist das anscheindend dein erster beitrag den du liest. Schade um die Zeit die ich damit verschwendet habe. Ich meine, ich gebe keine Antworten auf beträge bei denen ich mich selbst nicht auskenne. Und dann immer diese Halb-Antworten, die einen noch mehr in die irre führen... herrlich.
bL
Hey sorry, aber ich weiß net was das soll was du hier machst.
Überleg lieber mal wer hier gestern Abend Zeit für DICH geopfert hat?Ohne ein richtigen Code, kann ich dir leider auch nicht helfen, mit den 2 oder 3 Zeilchen die du hier gepostet hat fällt mir, und scheinbar allen anderen auch, nur das ein was schon gesagt wurde. So wie dein Code war( das bisschen was du gepostet hast ) war es definitiv völlig falsch.
Also ich kanns dir nur nochmal anbieten dass du wenn du magst jetzt den Code postet. Sprich Header-Dateien der beiden Klassen sowie die dazugehörigen Source-Dateien und die main.
Lg freeG