Отказ от ответственности Я программист PHP, обладающий опытом работы на Java, и занимался Obj-C/C++/C.
Я пытаюсь использовать IB SDK внутри приложения Obj-C. У меня есть подборка компиляции с файлами.mm против.cpp vs.m.
IB API имеет шаблон отправки и получения, когда класс EClientSocketBase
отправляет данные в API, а второй класс EWrapper
получает данные из API в отдельном потоке.
У меня есть Obj-C обертке класса, CppSend
, унаследованный от EClientSocketBase
класса, ObjCSend
для передачи данных в API. Вызов классов C++ из obj-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 |
--------------
Вы не можете использовать объект Objective-C или конструкции внутри программы C/C++.
Чтобы использовать объект Objective-C, вы можете использовать pimpl-idiom (Указатель на реализацию).
Например, в вашем случае будет класс CppSendImpl
а CppSend
будет иметь указатель.
Этот CppSendImpl
может быть реализован в Objective- C++ (не Objective-C), где он реализует код, требующий Objective-C, и может взаимодействовать с объектом Objective-C, который вы хотите.
Здесь вы можете использовать конструкцию Objective-C. Но если ваш CppSend
предназначен для клиента C++, вы не можете раскрывать или использовать какой-либо из Objective-C-схемы вне класса реализации.