我发现了一篇很棒的帖子Calling Objective-C method from C++ method?
但是,我必须提出2个问题,这使我克服这个问题非常棘手:请注意,我已对 MyObject-C-Interface.h
进行了更改#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__ 1
struct CWrap {
void * myObjectInstance;
int MyObjectDoSomethingWith (void *parameter) {
//how to call the
//myObjectInstance->MyObjectDoSomethingWith ???
}
}
#endif
1)如何在void * myObjectInstance上调用方法...
我的意思是,我无法转换为MyObject或以其他方式让编译器知道,调用什么方法:(
2)我如何实际使用它?
在我的中,让我们说 code.m 同时包含
#import "MyObject.h"
//and
#include "MyObject-C-Interface.h"
我愿意吗?
MyObject tmp = [[MyObject alloc] init];
CWrap _cWrap;
_cWrap.myObjectInstance = (void *)tmp;
//pass the CWrap to a deep C++ nest
myMainCPPCode->addObjectiveCToCWrap(_cWrap);
而不是我的深层C ++代码只需调用
_cWrap.MyObjectDoSomethingWith((void *)somePrameter)
我错过了一个链接,那就是如何将C包装函数链接到ObjectiveC函数:(
谢谢
答案 0 :(得分:3)
我的意思是,我无法转换为MyObject或以其他方式让编译器知道,调用什么方法
为什么不呢?
您的C ++包装类必须位于Objective-C ++文件(通常用.mm
)扩展名表示。然后,因为您甚至必须在类声明中声明私有实例变量,所以您需要一个私有成员来在类头中保存Objective-C指针。这必须是纯C ++编译器可以理解的东西,所以你能做的就是:
#ifndef __MYOBJECT_C_INTERFACE_H__
#define __MYOBJECT_C_INTERFACE_H__ 1
#if defined __OBJC__
typedef id MyObjCClass;
#else
typedef void* MyObjCClass;
#endif
struct CWrap {
MyObjCClass myObjectInstance;
int MyObjectDoSomethingWith (void *parameter);
}
然后在.mm
文件中
#import "ObjCClassHeader.h"
int CWrap::MyObjectDoSomethingWith(void *parameter)
{
return [myObjectInstance doSomethingWith: parameter];
}
__OBJC__
是在编译器编译Objective-C或Objective-C ++时定义的预定义宏