Как обрабатывать делегирование Objective-C от C ++?

Краткая версия: у меня есть Qt / C ++, к которому мне нужно добавить ограниченное количество кода Cocoa / Objective-C. Я изменил файл .cpp на файл .mm и добавил код / ​​объекты objective-c в указанный файл, и он компилируется и работает. Теперь мне нужен делегат для одного из созданных мной объектов - NSPopUpButton (или, точнее, его меню), если быть точным - и я застрял. Как я могу добавить делегата для этого объекта?

Подробности: Рассматриваемые файлы:

reportwindow.h, reportwindow.cpp ПЕРЕИМЕНОВАН в reportwindow.mm - это файлы, содержащие моя оригинальная реализация на C ++ плюс некоторый код target-c (откройте NSSavePanel, содержащий NSPopUpButton). reportwindow.h дополнительно включается в файл .cpp, если это имеет значение.

menuHandler.h, menuHandler.mm - эти файлы содержат (на данный момент пустой) класс objective-c, который я собирался использовать в качестве делегата.

Моя первая мысль заключалась в том, что я мог бы просто сделать C ++ классифицирует делегата, но это явно не работает, поскольку обычный C ++ не понимает делегирования. Затем я подумал, что создам отдельный класс objective-c как NSMenuDelegate и добавлю его экземпляр в качестве объекта-члена к моему классу C ++. Поскольку мне удалось добавить в качестве членов другие объекты objective-c, я решил, что это должно сработать.Однако, как только я включил заголовок для моего нового класса objective-c в файл заголовка класса C ++, я получил несколько сотен ошибок о «ожидаемом неквалифицированном идентификаторе до токена '@'» - из файлов заголовков Apple (NSValue.h , NSObject.h и т. Д.) Очевидно, это не сработало, по крайней мере, не как есть. Я получаю тот же результат, когда включаю ЛЮБОЙ заголовок какао в файл заголовка моего класса.

Затем я подумал, что могу попробовать прямое объявление класса objective-c (именно так я заставил работать другие объекты objective-c). однако это тоже не сработало - если я объявляю его как «class myClassName», я получаю сообщение об ошибке переопределения класса как другого типа символа (предположительно, класс C ++ против протокола objective-c). Если я попытаюсь пересылать объявление как @protocol myClassName, я получаю сообщение об ошибке «ожидаемый неквалифицированный идентификатор перед токеном @». Итак, как я могу заставить это работать?

6
задан ibrewster 25 October 2011 в 16:37
поделиться