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/ |