Цель C в C ++ - выходит за рамки - PullRequest
0 голосов
/ 02 февраля 2010

У меня маленькая проблема с WOsclib. Не особенно с библиотекой, это скорее функция обратного вызова. Для прослушивания определенных команд osc я должен установить метод обратного вызова, например

.
void TheOscStartMethod::Method(
                          const WOscMessage *message,
                          const WOscTimeTag& when,
                          const TheNetReturnAddress* networkReturnAddress)
{
    std::cout << "Got the start signal";
    start.alpha = 1.0;
}

начало - IBOutlet UIImageView.

Но компилятор говорит мне, что запуск выходит за рамки. Если я пытаюсь получить доступ к start в коде obj-c, он работает так, как должен.

Как я могу получить мои объекты Objective C в коде c или, по крайней мере, вызвать функцию target-c.

Спасибо

Ответы [ 4 ]

1 голос
/ 02 февраля 2010

Похоже, start - это переменная экземпляра, принадлежащая некоторому объекту Objective-C, и вы пытаетесь получить к ней доступ, просто записав ее имя из объекта C ++. Если это так, то должно быть совершенно очевидно, почему это не сработает: объект C ++ ничего не знает о start. Решение состоит в том, чтобы как-то дать объекту C ++ ссылку на объект Objective-C, которому принадлежит start.

1 голос
/ 02 февраля 2010

Сделайте файл объективным файлом C ++ с расширением .mm. Затем вы можете вызывать объекты C и C ++ в одном и том же коде.

XCode будет вызывать правильный компилятор из расширения файла (то есть добавление -x target-c ++ для команды компиляции)

Не то, чтобы C ++ и цель C были разными языками и не понимали объекты друг друга, поэтому для перемещения данных между ними вам необходимо преобразовать данные в тип C, например, void, charint и указатели на них.

0 голосов
/ 03 февраля 2010

Решение:

Я не знаю, является ли это лучшим способом сделать это, но это работает.

Должен существовать пустой объект c, который позже станет нашим целевым объектом c, который содержит все, к чему мы хотим обратиться.

static gsSearchForIp* delegate = NULL;

Мы должны определить функцию для установки целевого объекта c

void setCallbackDelegate(gsSearchForIp* del)
{
    delegate = del;
}

А потом позвони. (Я назвал это в initWithFrame методе)

setCallbackDelegate(self);

Теперь я могу вызывать метод с [delegate methodName:firstPara] в моем методе c ++. В этой функции у меня есть доступ ко всем моим вещам, которые мне нужны из класса gsSearchForIp.

0 голосов
/ 02 февраля 2010

Вам нужно будет сделать стартовый объект доступным для вашего другого кода.

Вы можете передать его, вы можете передать части, которые вы будете использовать, вы можете создать API для двух баз кода. Есть и другие варианты, все в зависимости от того, как именно вы хотите использовать различные объекты

...