Ссылка на объект obj-c в коде c ++

0

Отказ от ответственности Я программист 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 |
--------------
  • 1
    Вам нужно конвертировать оба файла в ObjC ++ или использовать посредника. C ++ фактически загрязнит ваши файлы Objective-C.
  • 0
    Что вы подразумеваете под преобразованием их или использованием какого-то среднего человека? Все заголовочные файлы - ".h", а все исходные файлы - ".mm". Я пытаюсь создать среднего человека с классами ObjCSend / Receive.
Показать ещё 6 комментариев
Теги:
objective-c++

1 ответ

0
Лучший ответ

Вы не можете использовать объект 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-схемы вне класса реализации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню