Hallo,
ich bin mit wenigen Monaten Erfahrung noch ein wenig neu in C++, habe aber bereits einige Projekte fertiggestellt (bzw. angefangen
). Deswegen bin ich mir auch nicht sicher, ob ich den Titel richtig formuliert habe.
Nun zum Problem:
Ich programmiere derzeit ein Spiel, das, wie die meisten anderen Spiele, den Rhythmus "HandleEvents -> Update -> Render"
durchläuft.
Es gibt eine Basisklasse, in der diese Funktionen virtuell deklariert sind und von der alle Objekte im Spiel erben.
Nun habe ich natürlich eine Liste mit dem Datentyp MainObject* angelegt (MainObject ist die Basisklasse aller Objekte). In dieser Liste sind alle Objekte des Spieles gespeichert und in Jedem Frame Wird der Rhythmus "HandleEvents -> Update -> Render" einmal für jedes Objekt in der Liste angewendet.
Die Liste ist so Deklariert:
|
C-/C++-Quelltext
|
1
2
|
std::list<MainObject*> ObjectList;
std::list<MainObject*>::iterator ObjectIt;
|
Ich rufe in der Liste die verschiedenen Funktionen folgendermaßen auf (Bsp. Update):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
for(ObjectIt = ObjectList.begin(); ObjectIt != ObjectList.end(); ObjectIt++)
{
MainObject *pMainObject;
pMainObject = *ObjectIt;
pMainObject->Update(/* Args */);
}
|
Da manche Objekte natürlich auch Daten anderer Objekte benötigen, übergebe ich bei Update auch immer die Objekt-Liste (und die FrameTime für Bewegungen):
|
C-/C++-Quelltext
|
1
|
void Update(float FrameTime, std::list<MainObject*> ObjectList);
|
Wenn ich die Liste habe, habe ich zwar auch alle Objekte mit Vererbungen (oder nicht?), aber (!) wie kann ich auf die Funktionen einzelner unterschiedlicher Objekte dann zugreifen, auch wenn die bestimmten funktionen nicht in der Baisklasse definiert sind? Denn z.B. hat ein Auto ja nicht die Variable Blätteranzahl, wie evtl. ein Baum, die aber beide von der selben Basisklasse (MainObject) erben.
Da der Iterator ja auf die Liste mit dem Datentyp MainObject* abgestimmt ist, zeigt es mir ja auch logischerweise keine Member von dem Baum oder so an. Aber wie kann ich denn auf die Member solcher klassen zugreifen?
Habe schon folgendes Probiert (GetID() gibt hier Beispielsweise nur Aufschluss darüber, um was für ein Objekt es sich handelt, und ob es das richtige für die Berechnungen damit ist. Die ID ist einmalig in der Liste):
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//Pointer für das Objekt erstellen
Baum *pBaum;
//Pointer auf das Objekt richten
for(ObjectIt = ObjectList.begin(); ObjectIt != ObjectList.end(); ObjectIt++)
{
if(ObjectIt->GetID() == "Baum")
{
/*Dies Funktioniert ligischerweise nicht, da *ObjectIt ja nicht immer ein Baum ist, sonder
evtl. ja auch ein Auto ist. Dies schließt die if()-Abfrage zwar aus, weiß der Compiler aber
ja nicht. Und ich weiß nicht, ob das sonst auch funktionieren würde. */
pBaum = *ObjectIt;
}
}
//Funktion ausführen, die nicht in der Basisklasse definiert ist
pBaum->BaumFunktion(/* Args */);
|
Nun, wie könnte man dieses Problem lösen, also das ich von der Bestimmten Klasse auf eine Funktion zugreife, die nicht in der Basisklasse ist? Oder geht das überhaupt gar nicht?
Danke schon mal für eure Antworten
mfg propper