Использование iterateFunc для вызова метода target c - PullRequest
0 голосов
/ 13 июня 2010

Используя spacemanager, мне нужно выполнять действия с выбранными телами после каждого шага, поэтому я решил, что лучше определить собственную функцию C для iterateFunc.

Все отлично работает, кроме меняЯ не уверен, как затем вызвать метод obj c в том же классе.Другими словами, класс obj c содержит как функцию c, заменяющую iterateFunc, так и метод, который необходимо вызвать.Я не понимаю, как сказать функции c, что такое «self», чтобы я мог вызвать метод.Насколько я могу судить, нет никакой возможности передать какую-либо дополнительную информацию новому iterateFunc.

Какие-нибудь идеи или лучший способ идти дальше?

Обновление:

Спасибо за ответ.Объявив новый spacemanager, можно переопределить его iterateFunc:

smgr = [[SpaceManager alloc] init];
smgr.iterateFunc=doThisFunc;

В том же классе может быть объявлена ​​функция doThisFunc.

В spacemanager эта iterateFunc вызывается изметод "step":

 -(void) step: (cpFloat) delta
{
.....
    cpSpaceHashEach(_space->activeShapes, _iterateFunc, self);
....
}

Итак, моей первой мыслью было создание подкласса spacemanager, и в моем методе пользовательского шага я вызываю cpSpaceHashEach с моим собственным классом вместо self (т.е. spacemanager),На полпути я понял, что мне даже не нужно было этого делать, поскольку все, что мне нужно было сделать, это создать подклассы и определить свой собственный метод шага.Мой новый метод шага:

-(void) step: (cpFloat) delta
{       
    [super step:delta];
    //Having of course set the "myObject" variable elsewhere as my other object
    [myObject doThis]; 
}

Спасибо, bbum за ваши ответы и за то, что помогли мне составить лучшие вопросы в будущем.

1 Ответ

1 голос
/ 13 июня 2010

Святая расплывчатость, бэтмен, где фрагмент кода? К счастью, магические силы Google спасли день.

Чтобы ответить на этот вопрос, требуется несколько деталей:

Что такое объявление iterateFunc?

О. Это cpSpaceHashIterator. Не полезно.

Ах ... вот оно:

typedef void (*cpSpaceHashIterator)(void *obj, void *data);

Похоже, аргумент void *data - ваш ответ. В частности, похоже, что это прозрачно передается вашей функции итератора. То есть, если вы позвоните:

cpSpaceEachBody(cpSpace *space, cpSpaceBodyIterator func, void *data)

Как это:

cpSpaceEachBody(space, funcPtr, (void *)self);

Тогда ваш итератор func может сделать это:

void iteratorFunc(void *obj, void *data) {
    [(MyClass *)data iterateThis: obj];
}
...