массив юнитов, надо внутри массивов рассортировать в порядке инициативы. Я вызываю для TArray функцию сорт и передаю туда предикат
Код вызова
Battle->Squads.Sort(FSortByInitiative());
Код предиката
struct FSortByInitiative
{
FSortByInitiative()
{
}
bool operator()(const ABaseSquad* A, const ABaseSquad* B) const
{
return A->GetStat().Stat.Initiative > B->GetStat().Stat.Initiative;
}
};
Мне компилятор выдает следующее https://sharetext.me/aeerhoilqc
как массив Squads обьявлен?
TArray<ABaseSquad*> Squads;
const ABaseSquad& A, const ABaseSquad& B попробуй
Поменяй с поинтера на ссылку
Сработало спасибо, это потому что Sort разименовал указатель и разименованное значение пихает в функцию сортировки?
Потому что он передает ссылки на элементы, что бы не копировать их. Учти, что по этим ссылкам у тебя находятся указатели, а не сами объекты
А как это может стрельнуть?
nullptr засуть в масив, посмотри, стрельнет или нет
Ну nullptr у меня не ожидается поидее.
Ну до релиза мы все так думаем)
Так ссылка не будет невалидной, а вот сам указатель, на который ссылка ссылается, очень может быть.
Я немного запутался, где это может возникнуть? Я понимю что внутри массива поинтеры могут быть нулевыми, но внутри проверки, там же референсы не на поинтеры на само значение или нет?
По идее реф на поинтер
Оу... А IsValid справится с проверкой такой?
Мы вот так делаем: MetaDataAssets.Sort([](const UMetaDataAsset& A, const UMetaDataAsset& B) { const UMetaDataAsset* APtr = &A; if(!APtr) return false; const UMetaDataAsset* BPtr = &B; if(!BPtr) return true; return APtr->Priority > BPtr->Priority; });
Обсуждают сегодня