Не забывайте практиковать защитное программирование! Инициализируйте значения ptr равными nullptr - никогда не предполагайте, что переменные инициализируются в C ++. Код if(Name)
не не проверяет, действителен ли UObject, он просто проверяет, есть ли какое-то значение в переменной - и это значение будет неким мусорным значением, если переменная имеет не инициализирован.
Кроме того, я бы рекомендовал проверять переменные (которые могут быть нулевыми) непосредственно перед их разыменованием.
в соответствии с документами UE4 :
GetWidgetFromName
возвращает виджет uobject, соответствующий данному имени
Если нет виджета uobject, соответствующего данному имени (например, из-за опечатки в предоставленном text или некоторый код logi c error), документы UE4 не являются явными, и я не тестировал их лично, но я предполагаю, что nullptr
будет возвращено. Если это так, возврат null произойдет после вашей if(Name)
проверки с разыменованием nullptr.
ie.
void UAccessWidgetFromCpp::F1(FString text)
{
if (Name)
{
Name = (UTextBlock*)GetWidgetFromName(TEXT("Name"));
// if there is no Widget with name "Name" then the variable Name
// may now be null even if it wasn't at the if check earlier
Name->SetText(FText::FromString(text));
}
}
Надеюсь, что это проясняет (называя переменная виджета "Name" уж точно не помогает).