2010-11-30 5 views
3

Je souhaite avoir un pointeur statique privé sur une fonction de ma classe. Fondamentalement, cela ressemblerait à ceci:Pointeur statique C++ vers la fonction

//file.h 
class X { 
private: 
    static int (*staticFunc)(const X&); 
    ... 
public: 
    void f(); 

}; 


//file.cpp 
void X::f() 
{ 
    staticFunc(*this); 
} 

Ceci me donne une erreur de "symbole externe non résolu". Je sais que les membres statiques doivent être initialisées dans le Cpp aussi, je l'ai essayé ceci:

int (X::*staticFunc)(const X&) = NULL; 

mais cela me donne une erreur « initialisation d'une fonction ». Cela me donne une erreur plus grossière si j'essaie de l'initialiser avec une fonction existante. Sans "= NULL", j'obtiens la même erreur.

Merci.

+0

Avez-vous essayé 'staticFunc = NULL;' dans le fichier .cpp? (Note: C'est moi oublier si vous devez redéclarer le type dans le fichier. Cpp, désolé) –

+0

Désolé, j'ai écrit le code sur la course. Je l'ai corrigé maintenant, bien sûr que je passais un paramètre à staticFunc quand je l'utilisais. Et j'écrivais en fait dans le fichier .cpp "int (X :: * staticFunc) (const X &)" au lieu de "int (* X :: staticFunc) (const X &)". Merci beaucoup pour vos réponses, c'était une erreur stupide. – stonecup64

Répondre

4
//file.cpp 
int (*X::staticFunc)(const X&); 

void X::f() 
{ 
staticFunc(*this); 
} 
+0

Oui. En l'épelant, une déclaration de membre de données 'static' dans une classe est * juste * une déclaration - elle a aussi besoin d'une * définition * distincte en dehors de la classe, exactement dans 1 unité de traduction (fichier de code source). –

+0

Vous pouvez ajouter un initialiseur '= NULL' ou' = & someFunc' à la définition 'X :: staticFunc'. Le nom du membre statique que vous souhaitez initialiser est 'X :: staticFunc', vous devez donc le qualifier de cette façon. Sans le 'X ::', C++ pensait que vous étiez en train de créer une déclaration différente. – aschepler

+0

'= NULL' est redondant. C'est garanti. – TonyK

2

Il est membre de X, vous devez donc dire

int (*X::staticFunc)(const X&) = NULL; 

Sinon, vous souhaitez créer une variable juste globale appelée staticFunc qui n'est pas lié à ce membre statique de X.

0

Problèmes de couple ici. La première erreur est que vous ne transmettez pas de paramètre dans votre tentative d'utilisation de staticFunc. Cela devrait provoquer une erreur de compilation que vous ne signalez pas.

Le deuxième problème est que votre syntaxe est incorrecte. TonyK a eu celui-là.

Questions connexes