Ungültige Typumwandlung mit static_cast, was richtige casting sollte ich verwenden?
Habe ich eine Art definition von typedef vector<Object*> ObjList;
ich habe auch eine Funktion vector<BigObject*>* ObjectBox::getBigObjectList();
. BigObject
ist inhertied von Object
Was ich wollte, zu tun ist, um eine vector<BigObject*>*
aus getBigObjectList()
und konvertieren Sie es in vector<Object*>*
, das ist ein nach oben Gießen, und dieser Typ ist definiert als ObjList
so dass ich im Grunde wollte, um Gespräche, die in einer ObjList
Typ
Ich habe zwei Möglichkeiten, die erste ist
ObjList *normalObjectList = (ObjList*) box->getBigObjectList();
Diese kompiliert und ich lese aus diesem Artikel ( Wann sollte static_cast, dynamic_cast, const_cast und reinterpret_cast verwendet werden? ), die sagt, dass C-style casting ist selten wünschenswert, da es sein kann, develped in eine reinterpret-cast
Dann versuche ich zu nutzen static_cast
, aber ich bekam eine Fehlermeldung Ungültige Typ-Konvertierung
ObjList *normalObjectList = static_cast<ObjList*> (box->ClipObjectInRect());
Weder wird diese Arbeit
ObjList *normalObjectList = static_cast<vector<Object*>*> (box->ClipObjectInRect());
Warum das nicht funktioniert? Ist dies, weil static_cast
können nur verwendet werden, um werfen der direkten Klasse (wie Object
selbst) anstatt einer verschachtelten (ich bin nur Total raten hier)? Was soll ich tun in diesem Fall?
Ich weiß nicht, was du genau meinst, nichts zu tun haben-Typen, da sind Sie Vektoren von geerbten Typen und ist ausdrücklich definiert mit
typedef
.InformationsquelleAutor ryf9059 | 2013-01-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Argumentation hat eine sehr übliche Fehler; ich denke, wir alle haben den gleichen Fehler gemacht irgendwann. Sie denken
std::vector<>
als nur ein Ausgabe-container, weil das ist, wie Sie wollen, es jetzt verwenden, aber es ist nicht.Nur vorstellen, dass der folgende code kompilieren:
Wie Sie sehen können, dass diese Besetzung würde Ihnen erlauben, zu versuchen, eine
SmallObject*
in dem, was kann nur dieBigObject*
. Dies würde sicher führen zu einem Laufzeitfehler.Übrigens: Sie können tatsächlich cast zwischen arrays von verwandten Arten. Dies ist ein Verhalten, übernommen von C. Und es führt zu Laufzeitfehlern 🙂
InformationsquelleAutor Gorpik
Static cast wird auch fehlschlagen, wenn der compiler nicht kennt (oder vorgibt Sie nicht zu kennen) über die Beziehung zwischen den Arten. Wenn Ihr Erbe nicht deklariert öffentlichen zwischen den beiden, der compiler wird Sie als nicht verwandten Arten und geben Sie die gleiche kryptische Warnung.
Diese nur etwas mir, also dachte ich würde teilen.
InformationsquelleAutor Dragos
Ich könnte falsch sein, aber ich denke, dass müssen Sie möglicherweise die Besetzung jedes einzelne Objekt im Vektor. Ich würde versuchen, überlastung getBigObjectList() zur Rückgabe eines ObjList*. Damit Ihre überladene Funktion würde folgendermaßen Aussehen
Einen bestimmten Grund, Sie beschreiben Ihre Vektor als Liste? Oder mit einem Vektor anstelle einer Liste an Erster Stelle?
EDIT: im Grunde, was Denis sagte.
InformationsquelleAutor caps