Ich versteh die OOP-Welt nicht mehr...
-
Nabend,
seit heute Mittag hab ich versucht einen Bug in meinem Programm ausfindig zu machen. Vor etwa 2 Stunden bin ich dem Fehler dann auf die Schliche gekommen, und es ist wirklich ein dämlicher Fehler...Ich hatte einen Zeiger auf eine lokale Variable in einen Vektor geschmissen, und später versucht darauf zuzugreifen (komischerweise gings solange gut bis ich eine Methode des Rückgabezeigers aufgerufen habe, bis dahin sagte der Debugger das alles in Ordnung ist und zeigte die Member-Variablen des Rückgabezeigers Ordnungsgemäß an, deswegen hats solange gedauert ihm auf die Schliche zu kommen. Mal davon abgesehn das das in ner DirectX-Vollbildanwendung ist)
*Quellcodes vereinfacht*
class CKlasse1 { protected: vector<CObject*> m_vObjectVektor; public: virtual CObject* CreateObject(); }; CObject* CKlasse1::CreateObject() { CObject obj; obj.SetMemberVars(verschiedene Parameter) this->m_vObjectVektor.push_back(&obj); return this->m_vObjectVektor.back(); }
richtig wäre natürlich erstmal Speicher mit new zu reservieren:
CObject* CKlasse1::CreateObject() { CObject* obj = new CObject; obj->SetMemberVars(verschiedene Parameter) this->m_vObjectVektor.push_back(obj); return this->m_vObjectVektor.back(); }
Aber dieser dämliche Fehler bringt mich zum Nachdenken...
Da man mit new soviel Speicher reserviert das es für ein CObject reicht kommen gewisse Fragen bzw. Vermutungen auf:- Vererbt man die CObject-Klasse in eine neue Klasse von mir aus CNewObject wird dann das CNewObject wieder in ein CObject gecastet wenn es dem Vektor übergeben wird bzw. werden die neuen Member-Variablen dann einfach "gelöscht" also kann man auf sie direkt nicht mehr zugreifen? Vermutung: Ich denke ja, man wird auf die neuen Member nicht mehr zugreifen können. wenn man z.B
Vektor.back()->m_NewVar;
benutzt. Der Compiler wird wohl meckern...
-Selbes Spiel wie oben, die CObject-Klasse wurde an eine neue Klasse vererbt. Was passiert wenn man jetzt virtuelle Methoden der alten Klasse mit neuem Code überschreibt, der auf neue Member-Variablen zugreift?
Vermutung: Speicherzugriffsfehler...Was meint ihr dazu, irre ich mich oder hab ich recht? Bzw. gibts eine Möglichkeit in vererbten Klassen neue Variablen hinzuzufügen auf die man dann auch in einem Vektor der Basisklasse Zugriff hat?
mfg Notrickz
-
Notrickz schrieb:
Vektor.back()->m_NewVar;
Hoppala :p das ist natürlich Mist, kein Mensch schreibt so ne Zeile, vergesst das Semikolon in der Zeile einfach. Ich dachte da z.B an Abfragen oder Zuweisungen mit Member-Variablen.
-
Versuch mal, nicht solche Schlangesätze zu bilden. Mir wird ja ganz schwindelig :)..
Ich denke, ein downcast wird dein Problem beheben:vector<CObject*>::iterator it = m_vObjectVektor.begin() ... static_cast<CNewObject*>(*it)->MethodeInCNewObject;
Damit sagst du dem Compiler, dass es sich um ein CNewObject handelt, und nicht um ein CObject. Allerdings ist bei solchen Sachen das Design zu überdenken, denn Castings sind nicht unbedingt ideal....
-
Notrickz schrieb:
- Vererbt man die CObject-Klasse in eine neue Klasse von mir aus CNewObject wird dann das CNewObject wieder in ein CObject gecastet wenn es dem Vektor übergeben wird bzw. werden die neuen Member-Variablen dann einfach "gelöscht" also kann man auf sie direkt nicht mehr zugreifen?
Solange du dem vector nur einen pointer auf das Object übergibst wird nichts gelöscht und man kann es casten wie CarstenJ es beschrieben hat.
Wenn man es ein vector währe der tatsächlich die Objecte fast, dann würden nur die Daten die zu dem CObject gehören übernommen und man könnte es auch nicht mehr casten.
Gruß Mirauder Mo