Обтекание Objective C в Objective c ++ / c ++ - PullRequest
6 голосов
/ 20 августа 2011

У меня есть приложение на c ++, написанное с использованием Boost / WXWidgets, предназначенное для Windows и Mac OSX.Однако у меня есть одна проблема, которую я не могу решить с помощью этих библиотек.Мое решение требует, чтобы я обернул класс Objective C, чтобы я мог вызывать его из одного из моих модулей C ++.Мои исследования пока говорят мне, что мне нужно использовать Objective C ++, записанный в исходные файлы с расширением .mm, что позволяет XCode рассматривать файл как сочетание Objective C и c ++.Я нашел много статей, подробно описывающих, как обернуть c ++, чтобы его можно было вызывать из ObjectiveC, но ничего, что не дает подробностей об обратном.Будем весьма благодарны за любые ссылки на статьи или, еще лучше, проработанный пример.

Ответы [ 3 ]

4 голосов
/ 20 августа 2011

Если вы хотите использовать многоразовую чистую оболочку C ++ для класса Objective C, то идиома Pimpl работает довольно хорошо.Идиома Pimpl сделает так, чтобы в заголовочном файле не было видимых вещей Objective C / Cocoa, которые будут включены в чистый код C ++.

2 голосов
/ 20 августа 2011

Просто перемешайте (но не забудьте настроить пул).Это работает.

 // obj-c code, in .mm file
 void functionContainingObjC(){
        NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init]; 
        [lots of brackets!];
        [pool release];
 }

 // c++ code, in .cc file
 functionContainingObjC();
1 голос
/ 21 августа 2011

objc предоставляет c-интерфейсы для основных интерфейсов и типов (#include <objc/headers_you_need.h>. Поэтому вы можете использовать эти интерфейсы в чистых TU c / c ++. Затем включить библиотеки типа Foundation или AppKit в mm и использовать типы objc и обмен сообщениями вреализация.

ниже приведен очень простой интерфейс, который не является типобезопасным, но я призываю вас сделать его типобезопасным для типа objc, который вы переносите. Этого должно быть достаточно, чтобы начать работу в правильном направлении.

// .hpp
namespace MON {
// could be an auto pointer or a dumb pointer; depending on your needs
    class t_MONSubclassWrapper {
    public:
// usual stuff here...

// example wrapper usage:
        void release();
    private:
        id d_objcInstance;
    };
} /* << MON */

// .mm
...
#include <Foundation/Foundation.h>

MON::t_MONSubclassWrapper::t_MONSubclassWrapper() :
  d_objcInstance([[MONSubclass alloc] init]) {
}
...
void MON::t_MONSubclassWrapper::release() {
    [d_objcInstance release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...