سؤال

أنا جديد على C ++ وأحاول إجراء بعض الاختبارات باستخدام C ++ و SDL وفي SDL لدينا وظيفة:

SDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param);

الذي يمكنني تمرير رد اتصال لجهاز مؤقت تم إنشاؤه. ولكن يبدو أنه يحول مثيلتي إلى *void ، لذا لا يمكنني استرداده مرة أخرى على طريقة التحديث التي تكون ثابتة ، وهي مثيرة للاهتمام ولكن SDL_ADDTIME لا تعمل على وظيفة رد الاتصال غير الثابتة.

حسنًا ، مشكلتي هي أنه عند محاولة استدعاء الطريقة العامة التي يتم تقديمها من خلال الوسيطة البارزة* ، فإنها تشكو من عدم كونها نوعًا من المؤشر إلى النوع ...

هل هناك أي طريقة يمكنني من خلالها الحصول على مثيل الحرف مرة أخرى داخل طريقة التحديث لأنني لا أتحكم في وظيفة SDL_ADDTIME ويجب علي تمرير المعلمات المطلوبة؟

شكرًا

#include "Character.h"

Character::Character(void)
{
  timer = SDL_AddTimer(33, update, this);
  this->render(); // is called without problem
}

//static method
Uint32 Character::update(Uint32 interval,void* param)
{
  param->render(); // yields: 'void*' is not a pointer-to-object type;

  SDL_Event event;

  event.type = SDL_USEREVENT;
  event.user.code = 1020;
  event.user.data1 = param;

  SDL_PushEvent(&event);

  return interval;
}

void Character::render(void)
{
  printf("rendering character \n");
}
هل كانت مفيدة؟

المحلول

لا تحتاج إلى reinterpret_cast - يجب أن يكون static_cast على ما يرام:

Character * cp = static_cast <Character *>( param );

يجب عليك تجنب reinterpret_cast - إنه دائمًا ما يكون للتنفيذ محددًا ، وقد يخفي المشكلات - تمامًا مثل قوالب C ذات الطراز القديم.

نصائح أخرى

قم بإلقاء مؤشر Parm الخاص بك على شخصية:

Character * charPtr = reinterpret_cast<Character *>(param);
charPtr->render();

والسبب هو أن C ++ هي لغة مكتوبة قوية. لتغيير نوع إلى آخر ، تحتاج إلى إلقاءه أولاً:

Uint32 Character::update(Uint32 interval, void* param)
{
    reinterpret_cast<Character* >(param)->render();

    /* ... */
}

للرجوع فقط ، إذا كنت تريد الاتصال بالكثير من الأشياء في وظيفة ، لحفظ جميع الأشياء السيئة RENINTPRET_CAST في كل مكان يمكنك القيام به

Character * myCharacter = reinterpret_cast<Character* >(param);

الذي يتيح لك ذلك فعل "mycharacter-> render () ؛" أو whataveyou ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top