# Casting from APawn* to MyCustomCharacter* ? Is this ok?

So I am still learning C++ but been using it for quite a while. But I have a function which is not working properly (separate question posted here: Calling Client RPC in order to assign a Team value to clients. How to check the Role properly? - Development Discussion / Multiplayer & Networking - Unreal Engine Forums).

I am starting to think the problem MIGHT be about how I cast from the APawn* to APlayerMallet* (which is actually extending ACharacter not APawn).

APlayerMallet* mallet=(APlayerMallet*)gamestate->PlayerArray[i]->GetPawn();


The code compiles and it does find the function in APlayerMallet if I change the IF statement to force it to call the function in APlayerMallet.

I suppose here I am just looking for confirmation that it is ok to do such a cast.

• Using a c-style cast like this ((APlayerMallet*)) basically tells the compiler: "I know what I'm doing don't do any checks. Whatever is at GetPawn address, interpret it as a APlayerMallet." Combined with "So I am still learning C++", I think you should try a static cast instead. The compiler will make sure that the type can be correctly cast. Does ACharacter extend APawn? Mar 5 at 2:10
• Also, FWIW, this appears to be a c++ related question more than a game dev question, which are generally off-topic here. Mar 5 at 2:11
• Thank you very much for this information. I will try with static cast. I did notice that PlayerArray has a Template function (for convenient casting) which I will also try. Also I thought this question fitted in the grey-area between c++ and gamedev since it was about Unreal specifically but I take onboard what you say about the question topic. Thanks again for helping me Mar 5 at 3:32
• ACharacter is an extended APawn , yes. And indeed APlayerMallet extends ACharacter. I am not sure if that is covered by the casting since the function I had to call to get access to the player was called GetPawn. However at some point in my testing I did indeed call some functions from the APlayerMallet so I think maybe the casting is not the actual problem. Again, thank you for the info about static_cast Mar 5 at 3:34

why not use the UE's Cast function?

APlayerMallet* mallet=(APlayerMallet*)gamestate->PlayerArray[i]->GetPawn();


Becomes:

APawn* ThePawn = gamestate->PlayerArray[i]->GetPawn();
APlayerMallet* mallet= Cast<APlayerMallet>(ThePawn); //returns nullptr if failed
if(!mallet)
{
//return or error handle
}
mallet->DoStuff();