[Resolu][Ndslib]Comment Déclarer Une Méthode Callback Dans Une Classe?


Asthroth
 Share

Messages recommandés

Bonjour à tous, j'ai des soucis pour "convertir" un bout de code en une classe et je pense que vous allez pouvoir l'aider étant donné que le problème est un pur problème de syntaxe C++, j'explique.

J'ai un code qui fait appel à une callback, donc ca fonctionne très bien en l'état, mais par contre dès que je veux en faire une classe, ca coince. Voici le code "classique":

#include <nds.h>
#include <stdio.h>

void OnKeyPressed(int key) {
   if(key > 0)
      iprintf("%c", key);
}

int main(void) {

   consoleDemoInit();

   Keyboard *kbd =  keyboardDemoInit();
   kbd->OnKeyPressed = OnKeyPressed;
   
   while(1) {
      char myName[256];

      iprintf("What is your name?\n");
      scanf("%s", myName);
      iprintf("\nHello %s", myName);

      scanKeys();
      while(!keysDown())scanKeys();

      swiWaitForVBlank();
      consoleClear();
   }

   return 0;
}

Et voici ma classe, en commencant par le header:

#ifndef DEF_VIRTUAL_KEYBOARD
#define DEF_VIRTUAL_KEYBOARD
#include <nds.h>

class VirtualKeyboard
{
    public:
	VirtualKeyboard();
	~VirtualKeyboard();
	
	Keyboard *kbd;
	void OnKeyPressed(int key); //méthode callback à chaque appuie sur une "touche" du clavier virtuel
};
#endif

Puis le CPP qui en découle:

#include "VirtualKeyboard.h"
#include <nds.h>
#include <stdio.h>

//Constructeur 
VirtualKeyboard::VirtualKeyboard()
{
	kbd =  keyboardDemoInit();
	kbd->OnKeyPressed = OnKeyPressed;
}
//destructeur
VirtualKeyboard::~VirtualKeyboard(){}

//méthode callback à chaque appuie sur une "touche" du clavier virtuel
void VirtualKeyboard::OnKeyPressed(int key) 
{
   if(key > 0)
      iprintf("%c", key);
}

et voici enfin le message du compilateur:

c:/devkitPro/Mes_Projets/ClasseKeyboard/source/VirtualKeyboard.cpp:11:22: error: cannot convert 'VirtualKeyboard::OnKeyPressed' from type 'void (VirtualKeyboard::)(int)' to type 'KeyChangeCallback {aka void (*)(int)}'

J'ai bien trouvé des explications sur le net, mais mes connaissances en c++ sont trop légères pour me permettre de comprendre ce qu'il faut faire.

Je sais que le soucis viens de la déclaration de la callback (OnKeyPressed) mais je n'arrive pas à le résoudre.

Auriez vous un petit peu de temps à me consacrer? merci d'avance.

Modifié par Asthroth
Lien vers le commentaire
Partager sur d'autres sites

Bon, j'ai réussi à résoudre mon soucis, voici la solution:

class VirtualKeyboard
{
    public:
	VirtualKeyboard();
	~VirtualKeyboard();
	
	Keyboard *kbd;
	static void OnKeyPressed(int key) //méthode callback à chaque appuie sur une "touche" du clavier virtuel
	{
		VirtualKeyboard* Obj = reinterpret_cast<VirtualKeyboard*>( key ); 
        return Obj->KeyboardFunc(key);
	}
 
    private:
       void KeyboardFunc(int key) 
    { 
		if(key > 0)
      iprintf("%c", key);
    }
};

Et voici le site que j'ai trouvé pour avoir quelques explications un peu plus claires pour moi:

http://alp.developpez.com/faq/cpp/?page=fonctions#CLASS_pblm_pointeur_fonction_membre

Lien vers le commentaire
Partager sur d'autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
 Share