2014-03-24 3 views
7

Ich benutze derzeit Unreal Engine 4 und es scheint, dass ich einige Casts nicht vermeiden kann.Prüfen, ob A eine Unterklasse von B ist?

AController* c = this->GetController(); 
APlayerController* p = (APlayerController*)c; 

Gibt es eine Möglichkeit, dass ich, wenn c überprüfen kann, ist ein PlayerController, bevor ich die Besetzung zu tun?

+0

Die Art und Weise wie Casts arbeiten ist "Versuch es, hat es funktioniert?". Wie die Answers antworten, wäre ein "dynamic_cast" die beste Wahl, gefolgt von einem "nullptr". – OMGtechy

Antwort

5

Wie viele Spielengines wird Unreal Engine aus Leistungsgründen ohne RTTI kompiliert, so dass dynamic_cast nicht funktioniert.

Unreal Engine bietet eine eigene Alternative, einfach Cast genannt. Ich kann keine Dokumentation dafür finden, aber this question beschreibt seine Verwendung schön.

AController* c = this->GetController(); 
APlayerController* p = Cast<APlayerController>(c); 
if (p) { 
    ... 
} 

AController hat auch eine bequeme Methode CastToPlayerController, die das gleiche tun wird:

AController* c = this->GetController(); 
APlayerController* p = c->CastToPlayerController(); 
if (p) { 
    ... 
} 

Wenn Sie sicher sind, dass c immer ein APlayerController sein wird dann CastChecked effizienter ist:

AController* c = this->GetController(); 
APlayerController* p = CastChecked<APlayerController>(c); 
... 

Bei Debug-Builds wird Cast verwendet und eine Bestätigung ausgelöst, wenn dies der Fall ist d gibt null zurück; in Release-Builds wird es zu einem schnellen static_cast aufgelöst.

7

Wenn die Klassen mindestens eine virtuelle Funktion haben (wahrscheinlich), können Sie dynamic_cast verwenden:

APlayerController* p = dynamic_cast<APlayerController*>(c); 

Dies wird eine Null-Zeiger zurück, wenn c nicht wirklich den richtigen Typ zur Laufzeit ist.

Bearbeiten Neben mindestens einer virtuellen Funktion erfordert dynamic_cast auch, dass in Ihrem Build Run-Time Type Information (RTTI) aktiviert wird. Es ist normalerweise Teil der Sprache, aber Compiler können das Ausschalten unterstützen.

+0

Wenn ich das mache, bekomme ich eine Warnung. 'warning C4541: 'dynamic_cast' benutzt für den polymorphen Typ 'AController' mit/GR-; unvorhersehbares Verhalten kann sich ergeben. –

+1

@MaikKlein: Das liegt daran, dass Sie die Laufzeittypidentifikation ausgeschaltet haben, was eine Funktion ist, die benötigt wird, damit 'dynamic_cast' funktioniert ~ [MSDN Referenz] (http://msdn.microsoft.com/de-de us/library/we6hfdy0.aspx). – legends2k

Verwandte Themen