Полезное

Мы Вконтакте

Discord канал

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

ЗЫ. пытался картинку засунуть в спойлер, но, похоже он работает только с текстами....
Последний раз редактировалось vkd 31 янв 2018, 16:30, всего редактировалось 1 раз.
Аватара пользователя
Пользователь
Сообщения: 2319
есть вероятность что текущий плаер стейт(валидный) который приводится к типу не является наследником ANetShoot...бла-бла.
Имя у него например дефолтное не совпадает с ANetShoot.... У твоего екземпляра класса ANetShoot по идее такое же имя должно быть.
Так что могу предположить что в этом проблема, но если раньше работало с таким же кодом, значит корень проблемы где-то раньше должен быть там где этот плаер-стейт указывается скорей всего.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 2319

_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 72
Snake писал(а):
есть вероятность что текущий плаер стейт(валидный) который приводится к типу не является наследником ANetShoot...бла-бла.
Имя у него например дефолтное не совпадает с ANetShoot.... У твоего екземпляра класса ANetShoot по идее такое же имя должно быть.
Так что могу предположить что в этом проблема, но если раньше работало с таким же кодом, значит корень проблемы где-то раньше должен быть там где этот плаер-стейт указывается скорей всего.


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

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

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

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

ошибка в другом месте скорей всего, там где задается указатель переменной PlayerState которая кастится...
ммм... вроде ж очевидно... либо я что-то не понимаю...
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 72
UCLASS()
class NETSHOOTER_API ANetShooterPlayerState : public APlayerState // это объявление класса ANetShooterPlayerState в его хедере

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

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

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

смысл каста в приведении к типу.
инстанс родительского класса нельзя привести к дочернему классу (ведь класс уже создан и его не поменяешь),
наоборот можно.
и если инстанс создан от ANetShooterPlayerState класса то его можно привести к любому типу и к ANetShooterPlayerState и к APlayerState.
вот нужно найти место где именно создается то что записывается в PlayerState переменную, проверить какого оно класса при создании.
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 72
мдаа, вот так
NSPlayerState = (ANetShooterPlayerState*)PlayerState;
сработало (NSPlayerState получило значения переменных из PlayerState), а Cast() не работает, что бы это значило?
Аватара пользователя
Пользователь
Сообщения: 2319
пример:
AParentActor и его наследник AChildActor
спавним AParentActor и безуспешно пробуем его привести к типу AChildActor.(потому что он им не является)
спавним AChildActor и без проблем приводим его к обоим типам.(потому что "чайлдактор" является представителем обоих классов)
_________________
we need to go deeper
Аватара пользователя
Пользователь
Сообщения: 72
в с++ обычная практика, когда дочерний тип приводится к родительскому это называется полиморфизм. Просто в этом случае инициализируются значениями объекта родительского класса те поля, которые являются для них общими, остальные же - заполняются случайными значениями.
Последний раз редактировалось vkd 01 фев 2018, 01:00, всего редактировалось 1 раз.


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

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