Überschreibe beim Laden wohlmöglich den Stack. Nur wo?
-
EiGelbbb schrieb:
Mein Problem ist wohl, dass alle Bücher bisher immer nur die Oberflächen erklärt haben.
"Mit cin >> gibst du Daten ein"... Doch was der Operator >> nun wirklich könnte, was cin eigentlich bedeutet, etc wird nirgends erklärt
Oder vielleicht bin ich wirklich nur zu dumm um das Alles zu verstehen
Deine Bücher machen das vielleicht so. Die Erklärung die du hier als Beispiel gibst ist auch schlecht bis falsch. Du hast auch tatsächlich überhaupt nicht verstanden, was cin bedeutet. Aber das sind viel zu viele, viel zu lange Fragen und die werden auch noch Folgefragen nach sich ziehen. Das kann ich nicht alles beantworten. Daher: Lies ein gutes Grundlagenbuch! Nichts für Spieleprogrammierer, für Dummies, von A bis Z oder in 21 Tagen, sondern ein gutes Buch!
-
cin ist selbst ein Streamobjekt des Typs std::ostream.
-
314159265358979 schrieb:
cin ist selbst ein Streamobjekt des Typs std::ostream.
ne,
istream
-
Hm, ok... Habe jetzt mal etwas rumprobiert.
Müsste es dann so aussehen?
ostream& operator<<(ostream &Stream, player& B) { Stream << B.getAiGold() << B.getAiFood() << B.getAiIron() << B.getAiStone() << B.getAiWood() << B.getDevelopment() << B.getForceStrength() << B.getHumor() << B.getInhabitants() << B.getProsperty() << B.getTimesPlayerRejectedOffer() << B.getTimesTradedWithPlayer(); return Stream; } istream& operator>>(istream &Stream, player& B) { Stream >> B.aiGold >> B.aiFood >> B.aiIron >> B.aiStone >> B.aiWood >> B.development >> B.forceStrength >> B.aiHumor >> B.aiInhabitants >> B.prosperty >> B.timesPlayerRejectedOffer >> B.timesTradedWithPlayer; return Stream; }
?
-
TyRoXx schrieb:
314159265358979 schrieb:
cin ist selbst ein Streamobjekt des Typs std::ostream.
ne,
istream
Ahjo, genau.
-
EiGelbb schrieb:
Hm, ok... Habe jetzt mal etwas rumprobiert.
Müsste es dann so aussehen?
Das sieht nicht verkehrt aus. Ob's natürlich richtig ist, dafür müsste ich deine Klassen genau kennen (aber das wäre mir wahrscheinlich auch zu viel Arbeit, wenn deine Klassen so aussehen, wie ich befürchte). Funktioniert es denn?
Wie du an deinem Code hoffentlich merkst, musst du an sehr viele verschiedene Sachen denken und wehe, du vergisst einen der Werte. Das liegt da dran, dass deine Klassen viel zu viele verschiedene Attribute haben. Die Namen deuten darauf hin, dass die eigentlich zu verschiedenen Untergruppen (z.B. ai) gehören, die du aber nicht konsequent ausmodelliert hast.
-
Ja, soweit schon. Nur habe ich Testweise alle Klassenvariabeln auf Public: gestellt. Muss ich wirklich immer temporäre ints etc anlegen und darüber dann set-Funktionen aufrufen?
Oder kann mein Stream auch gleich die Werte einer Funktion übergeben? Also,Stream >> B.setAiWood(?????)
Doch was wäre dann der Funktionsparameter, der den Wert übermitteln sollte?!
Vielen Dank außerdem für eine andauernde und kompetente Hilfe!
-
Mach die Funktion doch einen friend, so wie ich das im Beispiel gemacht habe, wenn dich das stört. Ansonsten ist die Benutzung von public-Funktionen für diese Anwendung nicht unüblich.
Wo ist denn eigentlich noch der Unterschied zu einem public-Member, wenn bei dir alles einen eigenen Getter und Setter hat? Wieder schlechtes Klassendesign. Machen deine Objekte überhaupt etwas oder sind das nur Datensammlungen?
-
Naja, der Spieler interagiert halt mit sehr viel mit den Objekten. Friend Deklaration hatte eben noch Fehler hervorgerufen, aber ich probiere es morgen noch mal. Hatte heute Abend nicht mehr die Muse, den Fehler zu suchen.
Du meinst also, die get/ set Funktionen gegen Friend-Deklaration austauschen?
-
EiGelbbb schrieb:
Du meinst also, die get/ set Funktionen gegen Friend-Deklaration austauschen?
Absolute Aussagen sind ausnahmslos immer schlecht.
Das kann man nicht so pauschal sagen. Beschäftige dich mal etwas mehr mit den Grundlagen des objektorientierten Designs, dann verstehst du, worauf ich hinaus möchte und kannst dann selber passende Entscheidungen treffen. Ist nicht schwer. Bloß fehlt dir das nötige Wissen. Daher nochmals der Hinweis auf Lehrbücher. Oder für dieses Thema sollte dir auch das Internet schon gut helfen können. Punkt ist eben, dass sowohl exzessives friend als auch exzessive getter und setter die Kapselung aufweichen, die man eigentlich erreichen möchte (aber in vielen schlechten Büchern wird das falsch vorgemacht, da die Autoren es selber nicht besser wissen), wodurch man sich die Mühe auch gleich hätte sparen können. Aber sie machen das jeweils beide ein bisschen anders und die Konsequenzen sind daher auch andere.