Да, это легко возможно в обоих направлениях, если вы знаете несколько приемов:
1) Тип "id" фактически определен в простом C-заголовке. Таким образом, вы можете сделать следующее:
В вашем заголовке:
#include <objc/objc.h>
class MyWindow
{
public:
MyWindow();
~MyWindow();
protected:
id mCocoaWindow;
};
В вашей реализации (.mm):
#include "MyWindow.h"
#include <Cocoa/Cocoa.h>
MyWindow::MyWindow()
{
mCocoaWindow = [[NSWindow alloc] init];
}
MyWindow::~MyWindow()
{
[mCocoaWindow release];
mCocoaWindow = nil;
}
2) Существуют две константы препроцессора, которые можно использовать для исключения кода, специфичного для C ++ / ObjC, когда исходный файл включает их один из двух, но не ObjC ++:
#if __OBJC__
// ObjC code goes here.
#endif /* __OBJC__*/
#if __cplusplus
// C++ code goes here.
#endif
Только будьте осторожны, вы не можете просто добавить / удалить ivars или виртуальные методы с помощью #ifdef, который создаст два класса с разным расположением памяти и приведет к аварийному завершению работы вашего приложения.
3) Вы можете использовать указатель на структуру без объявления ее содержимого:
В вашем заголовке:
@interface MyCppObjectWrapper : NSObject
{
struct MyCppObjectWrapperIVars *ivars; // This is straight ObjC, no ++.
}
@end
В вашем файле реализации (.mm):
struct MyCppObjectWrapperIVars
{
std::string myCppString1;
std::string myCppString2;
std::string myCppString3;
};
@implementation MyCppObjectWrapper
-(id) init
{
if(( self = [super init] ))
{
ivars = new MyCppObjectWrapperIVars;
}
return self;
}
-(void) dealloc
{
delete ivars;
ivars = NULL;
[super dealloc];
}
@end
Это сделает ваш заголовок простым стандартным C или ObjC, в то время как ваш файл реализации получает конструкторы / деструкторы всех ivars, вызываемых без необходимости создавать / удалять каждый из них как объект в куче.
Это все только сторона Mac, но это будет означать, что вы можете не допустить, чтобы ObjC-содержимое не попало в ваши заголовки, или, по крайней мере, заставить его компилироваться при использовании из межплатформенных клиентских файлов реализации Mac вашего C ++. слой переносимости.