Anfängerproblem mit Typcasting und STL-Vector
-
Sers,
Ich hab ein Convertierungsproblem.
Kurzer Auszug aus der Klassenhierarchie:
class TglForm: public TglObject{ public: int addComponent(TglComponent component);Ich benutze diesen Vector:
vector<TglObject*> FormTable;Ich möchte nun den Inhalt des Vectors als TglForm interpretieren und die dortige Funktion aufrufen:
return ((TglForm)*FormTable[parentFormID])->addComponent(component);Der Compiler meint dazu:
error: no matching function for call to `TglForm::TglForm(TglObject&)'Öhm...Was hab ich falsch gemacht?
-
statt
((TglForm)*FormTable[parentFormID])->addComponent(component);static_cast<TglForm*>(FormTable[parentFormID])->addComponent(component);Wobei ich nicht glaube, dass das dein Problem löst. Bist du dir sicher, dass ein "TglObject" ein "TglForm" ist? und nicht stattdessen "TglForm" mit Hilfe von "TglObject" implementiert werden sollte? ...
Caipi
-
Danke das war die Lösung.
Nein also...TglObject ist Vorfahre von TglForm. Die Form ist nur eine Spezialisierung. Das klappt schon so, oder funktioniert OOP in C++ anders...

-
KFlash schrieb:
Danke das war die Lösung.
Nein also...TglObject ist Vorfahre von TglForm. Die Form ist nur eine Spezialisierung. Das klappt schon so, oder funktioniert OOP in C++ anders...

wenn im vector an der stelle aber kein TglForm Zeiger sondern ein anderer
TglObject (TglCanvas oder weiss der Geier was) ist, dann bekommst du ein Problem...IMHO deuten solche Casts häufig auf einen Designfehler hin.
Überleg dir mal ob du wirklich ein vector<TglObject*> brauchst,
oder ob nicht ein vector<TglForm*> angebrachter wäre.phlox
-
Auch eine Überlegung wert wäre
dynamic_cast<TglForm&>(FormTable[parentFormID]).addComponent(...);Das macht im Gegensatz zum static_cast Radautz, wenn es fehlschlägt.
-
Ich habs jetzt so hingegrigt:
return ((TglForm*)FormTable[parentFormID])->addComponent(component);Das mit dem Design stimmt...allerdings kann man doch abfragen, auf was der Pointer Zeigt oder? In Delphi konnte man das checken...
also:
obj : TObject; Zuweisung(Obj) if Obj is TWasWeisIch then TuWas;