Unreal Engine 4
http://uengine.ru/forum/

Не удаётся скастить дочерний PlayerState от родительского
http://uengine.ru/forum/viewtopic.php?f=19&t=13110
Страница 1 из 2

Автор:  vkd [ 31 янв 2018, 14:24 ]
Заголовок сообщения:  Не удаётся скастить дочерний PlayerState от родительского

Имеется дочерний класс от APlayerState. Нужно через Cast инициализировать его объект из значения объекта родительского класса. Так вот, в проекте под версией движка 4.15 это работает, а под версией 4.18 - не хочет.
В чём может быть проблема?
На скрине окна дебагера видно, что я даже пытался инициализировать локальную переменную (сделав её статичной, потому что дебагер не хочет показывать значения локальных нестатичных объектов) и результат тот же самый - NULL.
[spoiler=] Изображение [/spoiler]

ЗЫ. пытался картинку засунуть в спойлер, но, похоже он работает только с текстами....

Автор:  Snake [ 31 янв 2018, 15:45 ]
Заголовок сообщения: 

есть вероятность что текущий плаер стейт(валидный) который приводится к типу не является наследником ANetShoot...бла-бла.
Имя у него например дефолтное не совпадает с ANetShoot.... У твоего екземпляра класса ANetShoot по идее такое же имя должно быть.
Так что могу предположить что в этом проблема, но если раньше работало с таким же кодом, значит корень проблемы где-то раньше должен быть там где этот плаер-стейт указывается скорей всего.

Автор:  Snake [ 31 янв 2018, 16:00 ]
Заголовок сообщения: 


Автор:  vkd [ 31 янв 2018, 19:53 ]
Заголовок сообщения:  Re:

Snake писал(а):
есть вероятность что текущий плаер стейт(валидный) который приводится к типу не является наследником ANetShoot...бла-бла.
Имя у него например дефолтное не совпадает с ANetShoot.... У твоего екземпляра класса ANetShoot по идее такое же имя должно быть.
Так что могу предположить что в этом проблема, но если раньше работало с таким же кодом, значит корень проблемы где-то раньше должен быть там где этот плаер-стейт указывается скорей всего.


Спасибо Вам большое за ответ))
Вероятно, Вы не до конца прочитали мой пост - в самом конце написано - "На скрине окна дебагера видно, что я даже пытался инициализировать локальную переменную (сделав её статичной, потому что дебагер не хочет показывать значения локальных нестатичных объектов) и результат тот же самый - NULL." Т.е. есть полная уверенность в том, что объект, который я пытаюсь инициализировать, точно является наследником от APlayerState. В этом то и загвоздка, с которой я пытаюсь разобраться - почему я не могу получить доступ к объекту родительского класса через Cast()?

Автор:  Snake [ 01 фев 2018, 00:00 ]
Заголовок сообщения: 

Цитата:
почему я не могу получить доступ к объекту родительского класса через Cast()

Цитата:
Т.е. есть полная уверенность в том, что объект, который я пытаюсь инициализировать, точно является наследником от APlayerState.

так Cast не к родительскому классу в коде а наоборот: PlayerState пытаешься привести к типу ANetShoot... и естесно не проходит...
о чем я и написал в сообщении.

потому что PlayerState родитель не обязан быть наследником ANetShoot...
Сам указатель PlayerState не является ANetShooterPlayerState классом , поэтому приведение к типу возвращает null.
чтоб к родительскому привести тогда должно быть:
Сast<APlayerState>(твой_ПлаерСтейт) - и это вернет не null,
Сast<ANetShooterPlayerState>(твой_ПлаерСтейт) вернет не null только если
"твой_ПлаерСтейт" является екземпляром класса ANetShooterPlayerState.
и вот тут то о чем я написал в сообщении... он им не является(!). по другому и быть не может иначе проблем бы с кодом не было.

ошибка в другом месте скорей всего, там где задается указатель переменной PlayerState которая кастится...
ммм... вроде ж очевидно... либо я что-то не понимаю...

Автор:  vkd [ 01 фев 2018, 00:22 ]
Заголовок сообщения: 

UCLASS()
class NETSHOOTER_API ANetShooterPlayerState : public APlayerState // это объявление класса ANetShooterPlayerState в его хедере

class ANetShooterPlayerState* NSPlayerState; // это объявление объекта в хедере NetShooterCharacter.h

NSPlayerState = Cast<ANetShooterPlayerState>(PlayerState); // это попытка привести родительский тип APlayerState к дочернему
// ANetShooterPlayerState в NetShooterCharacter.cpp

не в этом ли смысл каста?

Автор:  Snake [ 01 фев 2018, 00:38 ]
Заголовок сообщения: 

сам инстанс(екземпляр класса) указанный в переменной PlayerState плаер стейт уже создан и загружен в память, и создан он конкретного класса который не меняется, только уничтожить обьект и создать другой.
и создан инстанс в твоем случае скорей всего от класса APlayerState.

смысл каста в приведении к типу.
инстанс родительского класса нельзя привести к дочернему классу (ведь класс уже создан и его не поменяешь),
наоборот можно.
и если инстанс создан от ANetShooterPlayerState класса то его можно привести к любому типу и к ANetShooterPlayerState и к APlayerState.
вот нужно найти место где именно создается то что записывается в PlayerState переменную, проверить какого оно класса при создании.

Автор:  vkd [ 01 фев 2018, 00:44 ]
Заголовок сообщения: 

мдаа, вот так
NSPlayerState = (ANetShooterPlayerState*)PlayerState;
сработало (NSPlayerState получило значения переменных из PlayerState), а Cast() не работает, что бы это значило?

Автор:  Snake [ 01 фев 2018, 00:49 ]
Заголовок сообщения: 

пример:
AParentActor и его наследник AChildActor
спавним AParentActor и безуспешно пробуем его привести к типу AChildActor.(потому что он им не является)
спавним AChildActor и без проблем приводим его к обоим типам.(потому что "чайлдактор" является представителем обоих классов)

Автор:  vkd [ 01 фев 2018, 00:57 ]
Заголовок сообщения: 

в с++ обычная практика, когда дочерний тип приводится к родительскому это называется полиморфизм. Просто в этом случае инициализируются значениями объекта родительского класса те поля, которые являются для них общими, остальные же - заполняются случайными значениями.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/