#c #box2d #sfml
#c #box2d #sfml
Вопрос:
Я кодирую платформер на sfml и box2d, я хочу закодировать некоторые поля, которые я могу обойти, но по какой-то причине body->SetUserData("box")
говорит, что это невозможно convert const char [4] to void *
. Я следую руководству. В руководстве все работает нормально, но у меня появляется эта ошибка:
Error C2664 'void b2Body::SetUserData(void *)': cannot convert argument 1 from 'const char [4]' to 'void *'
Руководство: (оно на русском языке)https://www.youtube.com/watch?v=-eJXg2tGcyM
Код для поля:
b2PolygonShape shape;
shape.SetAsBox(30 / SCALE, 30 / SCALE);
b2BodyDef bdef;
bdef.type = b2_dynamicBody;
bdef.position.Set(600 / SCALE, 100 / SCALE);
b2Body *body = World.CreateBody(amp;bdef);
body->CreateFixture(amp;shape, 2);
body->SetUserData("box");
Ответ №1:
Этот учебник, вероятно, основывался на несоответствующем поведении в VS, которое позволяло преобразовывать строковые литералы в неконстантный указатель на char
. Поэтому вам следует либо изменить свой код, чтобы он был постоянным (рекомендуется), либо включить это старое поведение, используя /Zc:strictStrings-
опцию компиляции (не рекомендуется).
Комментарии:
1. Кроме того,
const char* box[] = {"box"}
правильно ли это делается? Кажется, это все исправляет, но есть ли лучший способ сделать это? (не используя /Zc:stringStrings — хотя это также устранило проблему)2. @Kerrot
const char* box[] = {"box"}
верно, но как это связано сSetUserData
? В любом случае, если вы используете эту строку для «тегирования» тела box2d, то, вероятно, было бы нормально просто привести егоbody->SetUserData(const_cast<char *>("box"));
, а затем привести обратно к правильному типуstatic_cast<char const *>(body->GetUserData())
при его извлечении.3. Хорошо, спасибо. const char* box[] = {«box}» связан, потому что я использовал его в setUserData.
4. @Kerrot Если
const char* box[] = {"box"}
был выделен стек, то сохраненный указатель пользовательских данных стал бы недействительным, как только поле вышло из области видимости.