免责声明我是一名PHP程序员,在Java方面有丰富的经验,并涉足过Obj-C/C++/C。
我正在尝试在Obj-C应用程序中使用IB SDK。我已经掌握了使用.mm与.cpp与.m文件进行编译的窍门。
IB API具有发送和接收模式,其中类EClientSocketBase
在单独的线程中将数据发送到API并且第二类EWrapper
从API接收数据。
我有一个obj-c包装器,它围绕着从EClientSocketBase
类ObjCSend
继承来的类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构造。