(Опитвам се) да напиша малко (работещ) 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