2009-03-11 8 views
3

Voici un exemple de ce que je veux accomplir et comment:Comment appeler un pointeur de fonction membre en utilisant un pointeur vers un objet constant?

class MyClass 
{ 
    public: 
     void Dummy() const{} 

}; 
typedef void (MyClass::*MemFunc)(); 

void (const MyClass * instance) 
{ 
    MemFunc func=&MyClass::Dummy; 
    // (instance->*func)(); //gives an error 
     (const_cast<MyClass *>instance->*func)(); // works 
} 

Pourquoi compilateurs (gcc 3 & 4) insistent sur le fait que l'instance doit être non-const? Est-ce que const_cast causerait des problèmes?

FYI: instance` n'est pas forcément const, je ne veux tout simplement pas qu'un callee s'en mêle.

Que se passe-t-il ici?

Répondre

7

L'erreur est dans la ligne précédente. Changez le typedef en

typedef void (MyClass::*MemFunc)() const; 

Pour en faire un pointeur vers un type de fonction membre const.

La différence pourrait être plus clair lorsque l'on considère ce code et comment cela fonctionne:

typedef void FunctionType() const; 
typedef FunctionType MyClass::*MemFunc; 

Un pointeur fonction de membre en particulier est en fait un cas particulier d'un pointeur en général. Pour une fonction membre const, le type de fonction de la fonction membre est différent de celui d'une fonction membre non const. C'est pourquoi les types doivent correspondre.

0

vide typedef (MyClass :: * MemFunc)();

Ici, vous définissez un pointeur vers une fonction qui pourrait modifier son objet.

MemFunc func = & MyClass :: Dummy;

Ici vous assignez une fonction qui ne sera pas changement d'objet est tout à un tel pointeur. Ceci est légal, puisque ne change pas est un sous-ensemble de pourrait changer.

(instance -> * func)();

Ici, vous essayez d'appeler une fonction qui pourrait changer son objet, à l'aide d'un objet qui ne peut pas être changé. Vous devez modifier la définition de MemFunc

Questions connexes