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


Messages recommandés

Posté(e) (modifié)

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
Posté(e)

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

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