2010-04-07 3 views
4

Tout d'abord, je suis très novice dans le domaine des pointeurs de fonction et de leur syntaxe horrible, donc jouez bien. J'écris une méthode pour filtrer tous les pixels de mon bitmap en fonction d'une fonction que je passe. J'ai écrit la méthode pour la déréférencer et l'appeler dans le buffer de pixels mais j'ai aussi besoin d'une méthode wrapper dans mon bitmap classe qui prend le pointeur de fonction et le transmet. Comment fait-on ça? Quelle est la syntaxe? Je suis un peu perplexe.Comment repasser un pointeur de fonction en C++

Voici mon code avec tous les bits non pertinents retirés et les fichiers combinés (lire toutes les variables initialisées remplies etc.).

struct sColour 
{ 
    unsigned char r, g, b, a; 
}; 

class cPixelBuffer 
{ 
private: 
    sColour* _pixels; 
    int _width; 
    int _height; 
    int _buffersize; 
public: 
    void FilterAll(sColour (*FilterFunc)(sColour)); 
}; 


void cPixelBuffer::FilterAll(sColour (*FilterFunc)(sColour)) 
{ 
    // fast fast fast hacky FAST 
    for (int i = 0; i < _buffersize; i++) 
    { 
     _pixels[i] = (*FilterFunc)(_pixels[i]); 
    } 
} 

class cBitmap 
{ 
private: 
    cPixelBuffer* _pixels; 
public: 
    inline void cBitmap::Filter(sColour (*FilterFunc)(sColour)) 
    { 
      //HERE!! 
    } 
}; 
+0

Bonnes choses. Merci a tous. Par curiosité seulement, quelle aurait été la syntaxe si je l'avais passée sans le typedef? – User2400

+0

@fneep: Quel typedef? – GManNickG

Répondre

4

Si je comprends ce que vous voulez:

inline void cBitmap::Filter(sColour (*FilterFunc)(sColour)) 
{ 
     _pixels->FilterAll(FilterFunc); 
} 

souvent traiter avec des pointeurs de fonction peut être rendu plus facile à lire si vous utilisez un typedef pour le type de pointeur de fonction (le vôtre est en fait pas trop mal lui-même - ils peuvent bien pire très facilement):

struct sColour 
{ 
    unsigned char r, g, b, a; 
}; 

typedef 
sColour (*FilterFunc_t)(sColour); // typedef for a FilterFunc 

class cPixelBuffer 
{ 
private: 
    sColour* _pixels; 
    int _width; 
    int _height; 
    int _buffersize; 
public: 
    void FilterAll(FilterFunc_t FilterFunc); 
}; 


void cPixelBuffer::FilterAll(FilterFunc_t FilterFunc) 
{ 
    // fast fast fast hacky FAST 
    for (int i = 0; i < _buffersize; i++) 
    { 
     _pixels[i] = (*FilterFunc)(_pixels[i]); 
    } 
} 

class cBitmap 
{ 
private: 
    cPixelBuffer* _pixels; 
public: 
    inline void cBitmap::Filter(FilterFunc_t FilterFunc) 
    { 
      _pixels->FilterAll(FilterFunc); 
    } 
}; 
+0

s/'(* FilterFunc)'/'FilterFunc'/ – Mehrdad

2

Vous pouvez faire des choses plus claires en utilisant un typedef pour votre type de pointeur de fonction:

typedef sColour (*FilterFunc_t)(sColour) 
void FilterAll(FilterFunc_t FilterFunc); 

Le passage d'une variable contenant un pointeur de fonction à une autre fonction fonctionne comme passage toute autre variable:

inline void cBitmap::Filter(FilterFunc_t FilterFunc) { 
    FilterAll(FilterFunc); 
} 
+0

Vol mon commentaire je vois. :) +1 – GManNickG

3

Les bibliothèques Boost peuvent vous rendre la vie plus facile ici. voir boost function.
Par exemple est ici une fonction qui prend une fonction de rappel qui prend deux int s et retourne un int:

void do_something(boost::function<int (int, int)> callback_fn); 

Ensuite, il peut être utilisé comme une fonction normale:

int result = callback_fn(1,2); 

Passez à do_something comme ceci:

boost::function<int (int, int)> myfn = &the_actual_fn; 
do_something(myfn); 

Avec fonction boost, vous pouvez également p Le membre de la classe ass fonctionne facilement (voir boost bind).
Bonne chance avec votre programme.

Questions connexes