从C ++方法调用Objective-C方法? [2]

时间:2011-01-20 12:31:02

标签: c++ objective-c c objective-c++

我发现了一篇很棒的帖子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函数:(

谢谢

1 个答案:

答案 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 ++时定义的预定义宏