Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.05.2006, 15:52

Vererbung Kind-Metoden

Ich wollte alle statischen Elemente (Häuser, etc. ) die sich auf einer Karte meines Spiels befinden in einer verketten Liste speichern.

Für die einzelnen Elemente habe ich mir verschiedenen Klassen geschrieben, wie z.B. CHouse, die neben den Positionsangaben, etc auch einen Pointer auf ein 3D Modell besitzen. Um die Liste möglichst einfach zu halten, habe ich alle diese Klassen von einer Klasse CMapElment abgeleitet und speichere in der Liste Pointer vom Typ CMapElement der auf Objecte vom Typ CHouse, CTrunk, etc. zeigt.

Soweit funktioniert das auch alles.

Allerdings soll jetzt jedes Object eine eigene Render() Methode besitzen, da sich z.B. ein CHouse Object auch noch darum kümmern soll, daß alle Türen des Gebäudes gerendert werden. Da der Pointer aber eben den Typ der Vaterklasse hat, wird auch die Render() Methode der Vaterklasse aufgerufen. Aufrufen sollte er ja aber eigentlich die Methode der Kind-Klasse.


Um das alles zu verdeutlichen hier ein Codeschnipsel


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class CMapElement();
class CHouse() : public CMapElement();
class CTrunk() : public CMap Element();

CHouse* haus1 = new CHouse();
CTrunk* trunk1 = new CTrunk();
...
addElementToList(haus1);     // addElementToList speichert den 

addElementToLost(trunk1);   // übergeben Pointer als CMapElement*

...

getElementFromList()->render(); // hier wird dann die Methode CMapElement::render() ausgeführt, und nicht CHouse->render() oder CTrunk::render()



Wieso er die Methode der Vaterklasse nimmt ist mir schon klar, aber wie schaffe ich es, daß er die Methode der Kind-Klasse nimmt? Einfach den pointer umcasten wäre vielleicht eine Möglichkeit, aber dann brauch ich 100 Zeilen switch-case Code...

CW_Kovok

Alter Hase

Beiträge: 836

Wohnort: nähe Bonn

Beruf: Schüler

  • Private Nachricht senden

2

18.05.2006, 16:15

du kannst zum beispiel ein Enum machen und den typ in das element mit speichern und dann über einen cast den zeiger in das passende umcasten, dann nimmt er auch die richtige funktion

//edit:

:wirbel: Autsch... oder du machst es wie Black-Panther unten beschreibt
Was es alles gibt, das ich nich brauche - Aristoteles

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

18.05.2006, 16:17

Also... ganz einfach... Die Lösung heißt Abstrakte-Parent-Klasse!

Du musst lediglich deine Rendermethode in der ParentKlasse so deklarieren

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
class CMapElement
{
private:
    //...


public:
   //...


   virtual bool Render(float fTime) = 0;
};
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

john

Alter Hase

Beiträge: 786

Beruf: Schüler

  • Private Nachricht senden

4

18.05.2006, 16:27

Jo und falls du durch Black-Panthers noch ein bisschen verwirrt bist:
Eine Klasse, die rein virtuelle Methoden beinhalten (Schlüsselwort: virtual) wird zu einer Abstrakten Klasse, die dazu gedacht ist, von ihr abzuleiten.
Dies nur noch einmal zur Erklärung, falls du das nicht wusstest ...
mfg
john

5

18.05.2006, 17:34

Danke für die Anregungen :)

Durch das umcasten bin ich erstmal auf einen Fehler bei der Speicherreservierung aufmerksam geworden.

An abstrakte Klassen habe ich garnicht mehr gedacht, da ich die ein oder andere abgeleitete Klasse ursprünglich noch weiter ableiten wollte.... und dann hätte mir das auch nicht weiter geholfen.
Allerdings ist das konzeptionell sowas von schwachsinnig, daß ich es jetzt doch mit einer abstrakten Basisklasse implementieren kann ;)

Beliah

Treue Seele

Beiträge: 115

Wohnort: Söhlde - LK Hildesheim

Beruf: FI-Anwendungsentwicklung

  • Private Nachricht senden

6

22.05.2006, 10:09

Nochmal eine Ergänzung.

Eine rein virtuelle Funktion ist eine mit dem vritual-Schlüsselwort und = 0

Beispiel :

C-/C++-Quelltext

1
virtual void VirtuelleFunktion() = 0;


Das Schlüsselwort virtual bewirkt "nur" das die Funktion Virtuell ist, also von Klassen die von dieser Klassen ableiten überschrieben werden kann was dazu führt das die überschriebene Funktion anstatt der Original-Funktion ausgeführt wird.

Also würde für ein Problem reichen das die Funktion virtuell ist. rein vrtuell ist nur bei Klassen notwendig von denen keine Instanz erstellt werden soll.
Debuggers don't remove bugs, they only show them in slow motion.

Google Suche ohne Werbung und Cookies: Scroogle

Derzeitige(s) Freizeitprojekt(e)

Werbeanzeige