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



免责声明我是一名PHP程序员,在Java方面有丰富的经验,并涉足过Obj-C/C++/C。

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

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

我有一个obj-c包装器,它围绕着从EClientSocketBaseObjCSend继承来的类CppSend来向api发送数据。从obj-c调用c++类似乎不是问题。但是,当我试图做相反的事情时,我遇到了一个问题。我不知道如何注入一个类,比如ObjCRecieve,来处理EWrapper中的回调。

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

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

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

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

例如,在您的案例中,将有一个类CppSendImpl,而CppSend将有其指针。

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

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

相关内容

最新更新