{
Super::BeginPlay();
FString Name = GetOwner()->GetActorNameOrLabel();
FVector Location = GetOwner()->GetActorLocation();
UE_LOG(LogTemp, Warning, TEXT("Mover Owner: %s"), *Name);
UE_LOG(LogTemp, Warning, TEXT("Actor Location: %s"), *Location.ToCompactString());
}
В этом коде я понимаю, почему * был помещен после AActor, но не понимаю, почему он не был помещен после FVector и FString, поскольку они тоже являются указателями. и как можно разыменовать переменные «Имя» и «Местоположение», если они являются не указателями, а строкой и вектором?
Я подписан https://www.udemy.com/course/unrealcourse/
*
— оператор, который можно перегрузить. Поскольку мы не знаем, что такое FString
и FVector
, мы не сможем вам помочь. Пожалуйста, прочитайте Как спросить с минимальным воспроизводимым примером.
В коде нет AActor
*
используется для двух (или более) разных целей. Его можно использовать для 1) разыменования, когда оно присутствует в выражении, или 2) как объявление переменной-указателя, когда оно входит в декларатор. В вашем примере Location
не объявлен как указатель. Также я очень рекомендую хорошую книгу по C++, прежде чем писать какую-либо настоящую продвинутую программу на C++.
вы ожидали увидеть FString* Name = GetOwn...
? В коде Name
и Location
не являются указателями, если только FString
и FVector
не являются типами указателей, и тогда FString* Name = ..
объявит указатель на указатель.
Вы говорите, что FVector
и FString
являются указателями, но документация Unreal с вами не согласна. Вместо этого FString
кажется классом, который перегружает оператор *
. И вы похоже неправильно прочитали *Location.ToCompactString()
. Это анализируется как *(Location.ToCompactString())
, поэтому *
применяется к возвращаемому значению ToCompactString
, а не к Location
.
Курс «Изучение C++ и создание видеоигр», который вы проходите, является амбициозным. Кто-то скажет, что название — это просто клик-приманка, и что правильнее всего будет сначала «Изучить C++», а затем «Создать видеоигры». Судя по тому, что я видел, нереальное программирование непростое, поэтому изучать C++ одновременно с нереальным будет непросто.
Итак (коротко говоря) в опубликованном вами коде нет указателей и разыменования. По крайней мере явно.
FString
имеет перегруженный operator*
, который производит TCHAR*
. (По моему мнению, это злоупотребление перегрузкой операторов.)
FString
перегружает унарный оператор *
, чтобы вернуть строку в стиле C const TCHAR*
, где TCHAR
обычно представляет собой 2-байтовый тип символа. Это упоминается в документации.
Фактическое определение этого в коде находится в UnrealString.h.inl , который включен в UnrealString.h.
Возможно,
FString
перегружает оператор разыменования*
?