在c ++代码中引用obj-c对象

时间:2013-12-07 04:48:01

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

免责声明我是一名具有Java经验的PHP程序员,并且涉足过Obj-C / C ++ / C.

我正在尝试在Obj-C应用程序中使用IB SDK。我已经掌握了.mm与.cpp vs .m文件的汇编。

IB API具有“发送和接收”模式,其中类EClientSocketBase将数据发送到API,第二个类EWrapper在单独的线程中从API接收数据。

我有一个obj-c包装类,CppSend,继承自EClientSocketBase类,ObjCSend,用于将数据发送到api。从obj-c调用c ++类似乎不是问题。但是,当我尝试反向时,我遇到了一个问题。我不知道如何注入一个类,比如ObjCRecieve来处理EWrapper中的回调。

我的objc发件人,看起来像这样:

// This class sends messages to CppSend
@interface ObjCSend
@property (atomic) CppSend* client;
...
@end

我的cpp发件人看起来像这样:

#import "CppReceive.h"
// This class sends messages to the IB Api.
class CppSend: public EClientSocketBase {
    public:
        CppReceive * incomingFromAPI;
        ...
}

我的cpp接收器看起来像这样:

#import "ObjCReceive.h"
// This class receives messages from the IB API, containing
// data relevant to the messages sent in CppSend
class CppReceive: public EWrapper {
    public:
        ObjCRecieve *outgoingToGUI;
        void setObjCReceive(ObjReceive * delegate);
        ...
}

这是我为Obj-C接收器所做的事情:

// This class should receive messages from CppReceive, containing
// data relevant to the messages sent in CppSend
@interface ObjCReceive
- (void)callbackHandler;
@end

我的问题出在CppReceive->delegate。我收到编译错误"Unknown type name 'ObjCReceive'"。我假设这是因为c ++头文件无法正确引用obj-c接口作为类型。

我如何创建一个Obj-C类,它可以在C ++类中解析和编译适当的类型?

编辑:数据流将是这样的

------------
| ObjCSend |
------------
     |
     V
-----------
| CppSend |
-----------
     |
     V
  --------
 ( IB API )
  --------
     |
     V
--------------
| CppReceive |
--------------
     |
     V
--------------
| ObjReceive |
--------------

1 个答案:

答案 0 :(得分:0)

您不能在C / C ++程序中使用Objective-C对象或构造。

为了能够使用Objective-C对象,您可以使用pimpl-idiom(指向实现的指针)。

例如,在您的情况下,将有一个类CppSendImplCppSend将有它的指针。

这个CppSendImpl可以在Objective-C ++(而不是Objective-C)中实现,它实现了需要Objective-C的代码,并且可以与你想要的Objective-C对象进行交互。

在这里,您可以使用Objective-C构造。但是,如果您的CppSend也适用于C ++客户端,则不能公开或使用任何Objective-C构造外部实现类。