Problem/Frage bei Klassenvererbung
-
Folgende Ausgangsposition
class Top { protected: int TopInt; public: void mGetTopInt(){ return TopInt; } }; class Unter1 : public Top { protected: int Unter1Int; public: void mGetUnter1Int{ return Unter1Int; } Unter1(int pUnter1Int) { Unter1Int = pUnter1Int; } }; class Unter2 : public Top { protected: int Unter2Int; public: void mGetUnter2Int{ return Unter2Int; } Unter2(int pUnter2Int) { Unter1Int = pUnter2Int; } };Problem:
Top* TopClass[3]; Top[0] = new Unter1(1); Top[1] = new Unter2(2); Unter1Int = Top[0]->mGetUnter1Int(); Unter2Int = Top[1]->mGetUnter2Int();Das funktioniert leider nicht. Aber ich hoffe es wird klar was mein Problem ist.
Beispiel Monopoly:
Ich habe Felder (Top)
Strasse ist ein Feld (Unter1)
Los ist ein Feld (Unter2)Strasse(Unter1) hat andere Methoden als Los(Unter2).
Trotzem möchte ich beides über Felder[FeldNr] (Top[x]) ansprechen können.Ich könnte die Methodenm in Top abstrakt machen, müsste dann aber einen leeren Funktionsrumpf in jede Unterklasse schreiben, und das finde ich unschön.
Ich habe mir gedacht, in dem Feld[] (Top[]) Array die Adresse zu den verschiedenne Objekte. So Greife ich mit Feld[1] auf das Strasse[2] Objekt zu, und mit Feld[0] auf das Los Objekt.
Ich hoffe ich konnte ohne große Verwirrung beschreiben um was es mir geht. Ich bin langsam selbst etwas verwirrt.
--------------------------------------------------------------
Hier ist mein UML Diagramm:
http://www.samuirai.de/Fakenopoly.jpg (das Bild ist zur hälfte zerschossen. Ich weiß nicht wieso. Liegt wohl an dem programm UmlPad)Ich habe mir gedacht, dass ich nacher einfach mit Feld[FeldNr] zugreifen kann und wollte mir auf Strassen, also wenn Feld[2] = new CStrasse(....), dann folgende Methode ausführen Feld[2]->mGetSpielerNr();
Das ist ein Schulprojekt und wird die Note eines halben Schuljahrs geben. Ich habe meine Planung als erstes für ganz gut empfunden, aber habe eben noch nicht so viel Erfahrung. Habt ihr irgendwelche Tipps für mich?
MfG FabiF
-
Guck dir nochmal Polymorphie an.
Falls du die Methoden nicht auf eine gemeinsame Syntax umbiegen kannst bleibt dir nur folgendes übrig:
Unter1* u1 = reinterpret_cast<Unter1*>(Top[0]); if( u ) { u->wasauchimmer(); } else { Unter2 *u2 = reinterpret_cast<Unter2*>(Top[0]); if( u2 ) { u2->irgendwasanderes(); } }
-
FabiF schrieb:
Folgende Ausgangsposition
class Top { protected: int TopInt; public: void mGetTopInt(){ return TopInt; } }; class Unter1 : public Top { protected: int Unter1Int; public: void mGetUnter1Int{ return Unter1Int; } Unter1(int pUnter1Int) { Unter1Int = pUnter1Int; } }; class Unter2 : public Top { protected: int Unter2Int; public: void mGetUnter2Int{ return Unter2Int; } Unter2(int pUnter2Int) { Unter1Int = pUnter2Int; } };Problem:
Top* TopClass[3]; Top[0] = new Unter1(1); Top[1] = new Unter2(2); Unter1Int = Top[0]->mGetUnter1Int(); Unter2Int = Top[1]->mGetUnter2Int();Das funktioniert leider nicht. Aber ich hoffe es wird klar was mein Problem ist.
Das ist klar das das nicht funktioniert... Erklärung folgt...
Beispiel Monopoly:
Ich habe Felder (Top)
Strasse ist ein Feld (Unter1)
Los ist ein Feld (Unter2)Strasse(Unter1) hat andere Methoden als Los(Unter2).
Trotzem möchte ich beides über Felder[FeldNr] (Top[x]) ansprechen können.Ich könnte die Methodenm in Top abstrakt machen, müsste dann aber einen leeren Funktionsrumpf in jede Unterklasse schreiben, und das finde ich unschön.
Ich habe mir gedacht, in dem Feld[] (Top[]) Array die Adresse zu den verschiedenne Objekte. So Greife ich mit Feld[1] auf das Strasse[2] Objekt zu, und mit Feld[0] auf das Los Objekt.
Ich hoffe ich konnte ohne große Verwirrung beschreiben um was es mir geht. Ich bin langsam selbst etwas verwirrt.
So, guter Mann ^^
Du hast das mit der Vererbung scheinbar etwas durcheinander gebracht...
Du kannst nicht eine Klasse Top deklarieren und mit einer anderen Klasse (Unter1) initialisieren. Auch deine Art auf die Objekte zuzugreifen ist komplett falsch.In deinem Fall brauchst du keine Vererbung.
Was genau willst du haben? Wenn ich es richtig verstanden habe möchtest du für verschiedene Felder eigene Klassen haben?
Wie Wäre es mit einer Klasse Spielbrett die ein Array zu einer Klasse Feld enthält in welcher dann die Informationen über das jeweilige Feld stehen?Beispiel (ungetestetes Brainstorming):
class Spielfeld { private: Feld m_fFelder[20]; //20 SPielfelder public: Feld* getFeld(int Feldnummer); }; class Feld { private: char* m_iFeldnummer; char* m_acBeschreibung; char* m_acFeldname; public: //Abfragemethoden };Dann kannst du im Spiel selber die Werte abfragen:
Spielfeld Fakenopoly; ... //Spieler landet auf einem Feld CurrentFeld = Fakenopoly.getFeld(spielerPos); CurrentFeld->doAction(); //...Wie man das genau aufteilt muss man je nach Spiellogik entscheiden...
Hoffe das hat etwas geholfen...
-
Wenn du mit Vererbung und Polymorphie arbeiten willst, geht das auch. Dafür musst du aber die Gemeinsamkeiten der Felder erkennen. Das Feld "Los" kann ebenso wie eine Straße betreten werden. Auf das Ereignis des Betretens reagieren beide Felder aber unterschiedlich. So könnte das Los den Kontostand des betretenden Spielers erhöhen und eine Straße ihn verringern, wenn sie bereits im Besitz von jemandem ist. Ansonsten bietet sie sich der betretenden Person zum Verkauf an. Du bräuchtest also in der Basisklasse nur eine abstrakte Methode:
class Feld { public: virtual void wirdBetretenVon(Spieler& spieler) = 0; };
-
@Don06
Oh Gott. Genau so habe ich mir es auch ursprünglich gedacht, und in einer Blinden wut voller verrückter Planung, das total aus den Augen verloren.
In meinem UML habe ich diese Abstrakte Methgode auch schon. mAktion() Jedes Feld hat diese.Mein Problem ist nur das Zusammenspiel von Oberfläche und Logik.
Wenn ich mAktion aufrufe muss ich der Oberfläche ja wieder irgendetwas sagen, z.B. zeige mir den Button zum Kaufen an, oder wenn es schon jemand gehört dann Animation zum Bezahlen der Miete.
Ich habe mir gedacht, dass mAktion dann einen Rückgabewert hat.
1: Strasse kaufbar
2: Strasse gehört Spieler
3+X: Ereigniskarte Nr X gezogen
15+X: Gemeinschaftskarte Nr X gezogen
....Aber dieser Stiel kommt mir etwas unschön vor. Gibt es eine Andere Möglichkeit?
---------------------
das <x> nennt sich doch vectoren, oder? Damit habe ich noch nie etwas gemacht.
Ist folgendes richtig?Spieler kommt auf ein Feld. Dies wird als FeldNr weitergegeben.
Feld[0] = new CStrasse;
Feld[1] = new CLos;CStrasse* Strasse = reinterpret_cast<Strasse*>(Feld[FeldNr]); if( Strasse ) { Strasse->mGetSpielerNr(); } else { CLos* Los = reinterpret_cast<Los*>(Feld[FeldNr]); if(Los) { Los->mGetDoppeltGehalt(); } }Dann ist das sozusagen eine Abfrage ob Feld[0] eine Strasse oder ein Los Feld ist.
Bei Feld[0] würde Strasse->mGetSpielerNr ausgeführt werden,
bei Feld[1] Los->mGetDoppeltGehalt.Ist das richtig?
Kennt ihr ein gutes Tutorial oder Beispiel, bei dem man gut erkennen kann wie das < > arbeitet?
Habe ein Buch (C/C++ Referenz - FRANZIS Professional Series) aber hab das nicht verstanden.MfG FabiF
-
Das < > ,wie du es nennst, ist ein Template.Such mal bei Google nach C++ Template.Dann wirst genug finden. Und bei fragen kannst du dann immerwieder zu uns kommen

-
FabiF schrieb:
das <x> nennt sich doch vectoren, oder? Damit habe ich noch nie etwas gemacht.
Ist folgendes richtig?Spieler kommt auf ein Feld. Dies wird als FeldNr weitergegeben.
Feld[0] = new CStrasse;
Feld[1] = new CLos;Siehe http://www.cplusplus.com/reference/stl/vector/push_back/
-
Die Artikel dieses Forums können auch ganz hilfreich sein. Unter anderem werden Templates und die STL erklärt.

-
Ich hab en Problem.
Ich dachte folgendes wäre Perfektmit den Get Methoden bekommt man den Wert der per Konstruktor mitgegeben wurde.
a* test[5]; b* b1[3]; c* c1[3]; void main() { test[0] = new b(1); test[1] = new b(2); test[2] = new c(3); test[3] = new c(4); for(int x=0; x<=3; x++) { b* b1 = reinterpret_cast<b*>(test[x]); if(b1) { cout << "A: " << b1->mGetB() << " \n"; } else { c* c1 = reinterpret_cast<c*>(test[x]); if(c1) { cout << "B: " << c1->mGetC() << " \n\n"; } } } cin.get(); cin.get(); }Erwartet habe ich folgendes:
A: 1
A: 2
B: 3
B: 4Bekommen tu ich das:
A: 1
A: 2
A: 3
A: 4Woran liegt das?
Ich habe gedacht, dass es nur in else rein geht, wenn test[0] kein b Objekt ist.
Aber wie kann passieren das es die Werte von dem C Objekt bekommt, obwohl man erkennt das es immer noch in dem A Teil ist.
Die Attribute der Klassen heißen unterschiedlich.MfG FabiF