Полезное

Мы Вконтакте

Discord канал

#
Пред.
12
Аватара пользователя
Пользователь
Сообщения: 8
Добрый день!
Изучаю ООП в С++ и параллельно делаю небольшую программу(не игра в чистом виде, а скорее обучение) в UE4.

Подскажите пожалуйста как сделать каст между созданными двумя функциями в разных классах.
1-й родительский класс для UMG - MyUserWidgetCplusplus - внутри определяю в паблике переменные и функции
2-й родительский класс для PlayerController - MyPlayerControllerCPP - внутри определяю в паблике переменные и функции
Всё работает в UE4 - видны функции и переменные,всё выполняется если не нужны пересечения двух классов.

В основном файле Test.cpp
Код:
#include "Test.h"
#include "MyUserWidgetCplusplus.h"
#include "MyPlayerControllerCPP.h"

int per1 = 0;

void UMyUserWidgetCplusplus::TestUfunction1()
{
   per1++;
}
 void AMyPlayerControllerCPP::TestUfunction2()
 {
    per1++;
   
   // Cast<UMyUserWidgetCplusplus>...как вызвать TestUfunction1??
 }


Спасибо за помощь!
Аватара пользователя
Пользователь
Сообщения: 29
Код:
if(Cast<UMyUserWidgetCplusplus>(myUserWidget) != null)
{
     Cast<UMyUserWidgetCplusplus>(myUserWidget)->TestUfunction1();
}


Сначала нужно получить ссылку на экземпляр класса, который потом будешь приводить кастом к нужному типу, после проверь на null, чтобы не вылетел при обращении к методу несуществующего экземпляра класса, а уже после вызывай нужный метод
_________________
Если ты ленивый нуб, то я - твоя профессиАНАЛЬНАЯ смерть.
Аватара пользователя
Пользователь
Сообщения: 8
HateNoobsSM писал(а):
Код:
if(Cast<UMyUserWidgetCplusplus>(myUserWidget) != null)
{
     Cast<UMyUserWidgetCplusplus>(myUserWidget)->TestUfunction1();
}


Сначала нужно получить ссылку на экземпляр класса, который потом будешь приводить кастом к нужному типу, после проверь на null, чтобы не вылетел при обращении к методу несуществующего экземпляра класса, а уже после вызывай нужный метод


Вот с этим и проблема...я не понимаю на что создать ссылку в этом классе...в определении класса создаваемого по умолчанию UE4 нет объекта и переменных....
Код:
UCLASS(BlueprintType, Blueprintable)
class Test_API UMyUserWidgetCplusplus : public UUserWidget
{
   GENERATED_BODY()
   
UFUNCTION(BlueprintCallable, Category = "temp")
void TestUfunction1();
};


и как на такой класс сделать ссылку не пойму ссори( Подскажите пожалуйста.
Аватара пользователя
Пользователь
Сообщения: 29
При создании виджета на выходе будет ссылка на экземпляр класса виджета.
Дальше ты пытаешься его привести к типу.Грубо ты проверяешь является ли экземпляр класса родственником этого класса (все классы, наследники от нужного тоже тебе дадут != null).
А дальше, после приведения, ты как бы работаешь с экземпляром нужного тебе класса и уже в нем и запускашь метод
_________________
Если ты ленивый нуб, то я - твоя профессиАНАЛЬНАЯ смерть.
Аватара пользователя
Пользователь
Сообщения: 29
Ты пойми, описание класса, это не более чем чертеж будущего экземпляра класса. Когда ты создаешь экземпляр (чеерез спаун эктора или new объекта), ты получаешь ссылку на область памяти, где находятся свойства и методы уже конкретного экземпляра. И тогда ты можешь обратиться к нему.
Но можно создать статичный метод и тогда вызывать его ты можешь прямо обратившись к классу, без приведения типов.
Это ООП, вааще-то, основы. Ты знаком с термином ООП?
_________________
Если ты ленивый нуб, то я - твоя профессиАНАЛЬНАЯ смерть.
Аватара пользователя
Пользователь
Сообщения: 29
Статичный метод описывается так:

Код:
static void TestUfunction1();


и обращение к нему будет

Код:
UMyUserWidgetCplusplus::TestUfunction1();


Если стоит -> это вызов метода или обращение к свойству экземпляра класса, если
:: то это обращение к статическим свойствам и методам класса
_________________
Если ты ленивый нуб, то я - твоя профессиАНАЛЬНАЯ смерть.
Аватара пользователя
Пользователь
Сообщения: 8
Большое спасибо за информацию. Ценю затраченное Вами время на меня...
ООП изучаю пару недель. Простые примеры в VC++ с ООП получаются нормально, а вот тут просто не врублюсь.
К сожалению у меня так и не получается вызвать функцию из другого класса в этом тестовом проекте С++ на UE4.

Возможно стоит попробовать экспериментальную функцию "из блупринта в с++" что ввели в 4.12..и конвертнуть там кастинг на другой блупринт...даже не знаю получится ли)

Касательно != null - я не обращаюсь вообще ни к каким виджетам. Я просто пытаюсь определенные паблик функции вызвать.
Аватара пользователя
Пользователь
Сообщения: 29
Ну вот смотри...
Есть методы класса, их можно вызвать из другого класса (читай экземпляра класса) или изнутри.
Если изнутри, то просто название метода и все.
Если снаружи, то приведение типа ссылки на экземпляр и потом вызов метода
_________________
Если ты ленивый нуб, то я - твоя профессиАНАЛЬНАЯ смерть.
Аватара пользователя
Пользователь
Сообщения: 29
В твоем примере ошибка - идет описание метода, относящегося к другому классу.
Заголовочный файл ты цепляешь чтобы получить описание методов и свойств другого класса, это не для присоединение самого класса.

ошибка тут:
Код:

void AMyPlayerControllerCPP::TestUfunction2() - ОШИБКА в описании метода, принадлежащего другому классу
 {
    per1++;
   
   // Cast<UMyUserWidgetCplusplus>...как вызвать TestUfunction1??
 }

_________________
Если ты ленивый нуб, то я - твоя профессиАНАЛЬНАЯ смерть.
Последний раз редактировалось HateNoobsSM 23 июн 2016, 15:08, всего редактировалось 1 раз.
Аватара пользователя
Пользователь
Сообщения: 8
HateNoobsSM писал(а):
Ну вот смотри...
Есть методы класса, их можно вызвать из другого класса (читай экземпляра класса) или изнутри.
Если изнутри, то просто название метода и все.
Если снаружи, то приведение типа ссылки на экземпляр и потом вызов метода


Изнутри получается без проблем, а вот снаружи...труба.
Возьму паузу попробую на других примерах без UE4...


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

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