2011-01-20 77 views
1

我发现了一个伟大的职位Calling Objective-C method from C++ method?从C++方法调用Objective-C方法? [2]

不过,我有2个问题,这使我克服这个问题很成问题:

注意,我进行了更改MyObject来-C接口.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) 

IAM缺少一个环节,这就是,如何在C wraper功能链接到的ObjectiveC功能:(

谢谢

回答

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++

+0

好的,但是如果我不能使用.mm(objective C++),但是必须使用.cc(C++),我会如何调用[myObjectInstance doSomethingWith:parameter] ? – 2011-01-20 14:11:02