Да, это легко возможно в обоих направлениях, если вы знаете несколько приемов:
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, в то время как ваш файл реализации получит конструкторы / деструкторы всех вызываемых ivar без необходимости создавать / удалять каждый из них как объект в куче.
Это все только со стороны Mac, но это будет означать, что вы можете убрать материал ObjC из своих заголовков или, по крайней мере, заставить его компилироваться при использовании из кроссплатформенных клиентских файлов реализации Mac вашего уровня переносимости C ++.
person
uliwitness
schedule
14.02.2010