ошибка: использование необъявленного идентификатора 'self' c ++ - цель c смешиванием - PullRequest
0 голосов
/ 24 августа 2018

Я сейчас заканчиваю свою игру для iOS, используя ue4.Я использую какой-то определенный код iOS и пытаюсь вызывать методы, используя переменную 'self'

void Aaccessactorios::Shareoption() {
    [self Sharebutton];//ios                 
}

Код находится внутри тега препроцессора #if PLATFORM_IOS и # endif

Я думаю, чтоЯ объявил переменную self в начале моего cpp-файла:

-(id)init
{
    self = [super init];

    return self;
}

Другие форумы Упоминаем, что движок Unreal собирает все cpp .mm в конце, так что я не думаю, что это проблема.

переменная self используется во всех компонентах c, поэтому она важна для моего кода.Как правильно смешать код и сделать так, чтобы моя переменная self объявлялась?

Спасибо

edit: это часть, которую я пытаюсь воссоздать https://answers.unrealengine.com/questions/422323/callback-from-objective-c-back-to-the-c-layer.html

1 Ответ

0 голосов
/ 25 августа 2018

Я постоянно смешиваю C ++ и Obj-C. Экземпляр класса Obj-C отличается от экземпляра C ++. Экземпляр класса C ++ имеет this. Там нет self. Экземпляр класса Obj-C имеет self. Подробнее об этом можно прочитать здесь:

Разница в ч / б Цель С и С ++ это?

Исходя из того, что вы написали, у вас есть класс C ++ Aaccessactorios. Не ясно, кто определил Sharebutton. Если он находится в классе C ++, то вы бы назвали его

this->Sharebutton();

или просто

Sharebutton();

Если Sharebutton принадлежит классу Obj-C, то вам нужно, чтобы C ++ либо имел указатель на экземпляр класса Obj-C, либо передавал его в функцию. Примером последнего будет:

void Aaccessactorios::Shareoption(ObjCClassObj *obj) {
    [obj Sharebutton];//ios                 
}

В этой ссылке на код вы можете видеть, что они на самом деле делают первое.

 class IOSMediaPlayerController
 {
 public:
     IOSMediaPlayerController();
     ~IOSMediaPlayerController();
     void startPlayback();
     void stopPlayback();
     void callbackFunc();

     #if PLATFORM_IOS
     IOSMediaPlayerControllerObj *playerObj;
     #endif    
 };

Здесь вы можете видеть, что playerObj является ссылкой (указателем) на объект Obj-C. Это создано в конструкторе с этим

 IOSMediaPlayerController::IOSMediaPlayerController()
 {
     #if PLATFORM_IOS
     playerObj = [[IOSMediaPlayerControllerObj alloc] init];
     #endif
 }

И затем вызывается

 void IOSMediaPlayerController::startPlayback()
 {
     #if PLATFORM_IOS
     [playerObj startPlayback];
     #endif
 }

Обратите внимание, что пример кода не вызывает self, он вызывает созданный конструктором экземпляр playerObj.

...