I would recommend not to store a pointer to the player camera at all,
wouldn’t even store a pointer to the player holding the weapon but only a pointer to the actor holding the weapon, the weapon holder should be of type Pawn or a child class of Pawn
then you can do something like this:
auto* controller = Cast<APlayerController>(WeaponHolder->GetController());
FVector PlayerViewLocation;
FRotator PlayerViewRotation;
controller->GetPlayerViewPoint(PlayerViewLocation, PlayerViewRotation);
FVector PlayerViewDirection = PlayerViewRotation.Vector();