Я (пытаюсь) написать некоторый (работающий) C++ в проекте ObjC :-) Библиотека C++ (Box2D) предоставляет мне класс b2Fixture, который имеет свойство «пользовательских данных», чтобы кодеры могли хранить все, что имеет к ним отношение.
В моем случае он просто должен хранить целое число. Из моей основной программы в ObjC нужно преобразовать целое число в void*:
headFixture->SetUserData( (void*) 10 );
В служебном методе на стороне программы C++ я хотел бы сравнить пользовательские данные с заданным целым числом (т.е. они являются константами, 10 = твердая земля, 11 = платформа и т. д.).
Первое сравнение использует (void*), которое отказывается компилироваться. На SO нашел другой подход, как показано во втором сравнении, в котором используется *( (intptr_t *) ... ). Тот компилируется, но отправляет EXC_BAD_ACCESS:
bool AbstractContactListener::contactContainsType(JRContact contact, int type){
if (( type == ( (void *) contact.fixtureA->GetUserData() )) ||
( type == *( (intptr_t *) contact.fixtureB->GetUserData() ))
) {
return true;
}
return false;
}
У меня заканчиваются идеи, чтобы подойти к этой проблеме. Помогите пожалуйста :-) Спасибо! Дж.
РЕДАКТИРОВАТЬ/РЕШЕНИЕ:
bool AbstractContactListener::contactContainsType(JRContact contact, int type){
if (( type == (intptr_t) contact.fixtureA->GetUserData() ) ||
( type == (intptr_t) contact.fixtureB->GetUserData() )
) {
return true;
};
return false;
}
Этот сработал для меня!
*contact.fixtureB->GetUserData()
, то, конечно, произойдет сбой. - person Seth Carnegie   schedule 06.02.2012SetUserData
— библиотечная функция, которая принимаетvoid*
. Это распространенный способ разрешить данные, предоставленные пользователем. Обычно вы сохраняете указатель на свои данные, а затем выполняетеstatic_cast
вT*
, когда он передается вам в обратном вызове или что-то в этом роде. Однако, покаint
не больше, чемvoid*
, простое приведение его кvoid*
, а затем обратно может избавить вас от необходимости выделять память для того, что является константой. - person R. Martinho Fernandes   schedule 06.02.2012