Полезное

Мы Вконтакте

Discord канал

#
12
След.
Аватара пользователя
Пользователь
Сообщения: 2319
так ты наоборот родителя к дочернему типу пытаешься привести...
дочерний к родителю без проблем приводится...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 72
плюсам без разницы - что туда, что оттуда. Код этот кастовый, кстати, из книжки unreal-engine-4-x-example взят
Аватара пользователя
Пользователь
Сообщения: 72
и на 4.15 версии движка он отлично работает (каст)
Аватара пользователя
Пользователь
Сообщения: 72
Только вот непонятно, почему же Cast() не работает? Это только у меня так? Или Эпики в 4.18 сделали ограничение в направлении каста? Или это просто баг?

Вот пример плюсового кастинга от наследника к базе

String *object = getString();
AdvancedString *searchable =
dynamic_cast<AdvancedString*>(object);
if (searchable != 0) {
// Переменная object указывает на объект, являющийся
// AdvancedString, searchable можно использовать.
} else {
// Переменная object указывает на объект, не являющийся
// AdvancedString, searchable == 0.
}

Но тут они добавляют -

Приведение переменных базовых классов к типам наследников («вниз по иерархии»,
downcasting), реализуемое dynamic_cast, используется на практике, но часто порицается
и может свидетельствовать о несовершенстве архитектуры программы.

Потому, возможно, Эпики и могли урезать функционал Cast(), ограничив его приведением вверх по иерархии наследования...
Если у кого-то есть официальная инфа, дайте знать, плз.
Аватара пользователя
Пользователь
Сообщения: 2319
почитал я чутка про Downcasting

учитывая что метод Cast() это уже анриаловский метод приведения к типу, а не С++
могу предположить что что он и не должен выполнять Downcasting , бай десинг.
Пруфы : начиная с того что это не работает на практике
viewtopic.php?p=58126#p58126
, заканчивая ответами на ансверхабе в т.ч. от staff-а.(найти которые можно в гугле "unreal downcasting")

По идее необходимость в downcasting возникает только при неправильно проектировании...

но я еще раз уточню на всякий случай:
если существующий екземпляр класса является дочерним.
то он приводится к родительскому типу без проблем,
Приведенный к родительскому типу этот же обьект записываем в переменную( класса родительского типа),
и вот тут downcasting сработает без проблем чтоб обьект привести назад к дочернему типу.

Код:
//тоесть
class AParentActor{/*...*/};
class  AChildActor : public AParentActor{/*...*/};

new  AChildActor* CActr;

AParentActor * PActr = Cast<AParentActor >(CActr); //успешно приведет к  родительскому типу
AChildActor*Var = Cast<AChildActor>(PActr );     //тоже успешно приведет к дочернему типу
// потому что инстанс обьекта изначально дочернего типа

_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 72
Спасибо за наводку как заюзать именно Cast(). Только непонятен вот этот синтаксис

Цитата:
new AChildActor* CActr;
, типа получение адреса через new? тогда вот так
AChildActor* CActr = new AChildActor*(); // может? Или тогда уже лучше через NewObject() это сделать?

Вообще, пытался идти путем плюсовым через static_cast (dynamic_cast не работает). В принципе, все работает...кроме того, что переменные члены наследника с мусором внутри, почему то дефолтные значения из конструктора не попали в них.
Аватара пользователя
Пользователь
Сообщения: 2319
Цитата:
, типа получение адреса через new? тогда вот так
AChildActor* CActr = new AChildActor*()

да верно, просто обозначил что обьект уже существует, и он конкретного класса.
_________________
we need to go deeper


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница