verschiedene Klassen in einem Vektor
-
nur suchte ich nach dem Grund für static_cast.
Paranoia ?
Ciao ...
-
Also,
ich hab das jetzt so gemacht (nicht ganz so, aber man könnte es so sehe):
class CBase : public CIrgendeineKlasseVonDerEngine { public: int m_iLebenspunkte... BOOL IstSichtbar; virtual void Render(float fTime)=0; virtual void Move(float fTime)=0; } // ... class CPlane : public CBase { public: int m_iAnzahlSchüsse; void Render(float fTime)=0; void Move(float fTime)=0; }
std::vector<CObject*> vObject; vObject.resize(1); vObject[0]=new CPlane;
Wenn ich aber nun vObject->Move() oder vObject->Render() aufrufe, stürzt der Computer ab, bzw. springt in die Zeile, bei der die Funktion aufgerufen wurde. Die eigentlich Funktion wurde aber nicht aufgerufen.
Hat jemand eine Idee, was falsch ist,
Danke
-
Was meinte eigentlich operator void? Das habe ich auch nicht ganz verstanden...
-
Nimm doch ma das =0 am Ende der Methodendeklarationen der abgeleiteten Klasse weg...
-
Schuldigung.
Heißt natürlich virtual void Render(); und auch BOOL IsVisible**()**
Hoffe, dass mein Problem gelöst werden kann,
Danke,
__Anfänger__
PS: und wie ist das nun mit dem
Und als kleinen Bonus kannst du die Objekte dann ohne undefiniertes Verhalten freigeben, wenn du ihnen einen virtuellen Konstruktor spendierst. Ansonsten hätte "delete v[i]" vermutlich nur den Speicher freigegeben, aber den Destruktor nie aufgerufen...
-
Kurz:
struct Base {}; struct Derived : Base {}; Base* b = new Derived; delete b;
Was die letzte Zeile tut, ist undefiniert, weil Base keinen virtuellen Destruktor hat. Richtig geht es so:
struct Base { virtual ~Base() {} };
Als Faustregel sollten Basisklassen einer Hierarchie einen virtuellen Destruktor und privaten Kopierkonstruktor und Zuweisungsoperator haben. Also mal ausführlich:
class Base { private: // Werden nie definiert. So kann man nicht aus Versehen einer Base- // Instanz eine Derived-Instanz zuweisen. Base(const Base&); Base& operator=(const Base&); public: // Erlaubt definiertes Löschen durch ein Base* virtual ~Base() {} };
-
Aha,
das ist klar. Leider stürzt das Pogramm immer noch ab. Ich hab schon hunderte Versuche unternommen, aber es passiert immer noch. Auch, wenn externe Objekte (also nicht Objekte innerhalb des Vektors) gerendert oder bewegt werden sollen. Der Debugger sagt mir soweit gar nichts, außer Acress violation.
Kann vielleicht jemand etwas damit anfangen?
Danke
-
vObject ist doch deine Liste ?
Und Move und Render sind Methoden deiner ListObjecte ?muesste also maximal heissen vObject[0]->Move(); oder so ?
aber ich nehm mal an, das meintest du auch ? Kompilieren wuerde er das so nich :p Und zeig mal, wie du die casts machst ? Da deine Listelemente ned vom typ CBase sind, kennt der compiler das move und render ned ... erst nach dem cast ...
CObject ist das der MFC Typ, oder selbst definiert ?Ciao ...
-
Hast du denn schon das gemacht was D1BAKEL gesagt hat?
-
Ja, hast du schonmal gemacht, was ich gesagt hab???