2010-11-20 5 views
2

J'ai la classe suivante:pointeur C de la fonction de membre, déclaration

class Point2D 
{ 
protected: 

     double x; 
     double y; 
public: 
     double getX() const {return this->x;} 
     double getY() const {return this->y;} 
... 
}; 

et pointeur vers la fonction de membre déclaré dans une autre classe:

double (Point2D :: *getCoord)() const; 

Comment déclarer/pointeur initlialize au membre fonction pour:

1] fonction membre de classe statique

Process.h 

class Process 
{ 
    private: 
     static double (Point2D :: *getCoord)() const; //How to initialize in Process.cpp? 
     ... 
}; 

2] Fonction non membre de la classe

Process.h 

double (Point2D :: *getCoord)() const; //Linker error, how do declare? 

class Process 
{ 
    private: 
     ... 
}; 

Répondre

1

Selon le FAQ il est préférable d'utiliser typedef:

typedef double (Point2D::*Point2DMemFn)() const; 

class Process 
{ 
     static Point2DMemFn getCoord; 
     ... 
}; 

Initialisation:

Process::getCoord = &Point2D::getX; 
+0

'Process :: GetCoord = & Point2D :: getX,' n'est pas une définition valide (ou déclaration) car il n'y a pas de type, il est juste une mission expression donc pas valide là où vous l'avez. Était-ce censé être une définition? –

+0

La question était de savoir comment déclarer/initialiser le pointeur getCoord. J'ai d'abord écrit comment le déclarer, puis comment l'initialiser. – Dialecticus

+0

Vous avez modifié la déclaration, mais je ne vois pas de définition (dont l'absence était probablement la cause de l'erreur de lien dans la question) ou une initialisation (l'affectation n'est pas la même que l'initialisation), peut-être que je Ne comprends pas ce que vous essayez de montrer? –

2

La seule chose y Vous ne l'avez pas fait est de qualifier le nom de la fonction avec le nom de la classe dont il est membre. Au lieu de fournir une définition de Process::getCoord, vous avez déclaré un pointeur-à-un-membre global appelé getCoord.

double (Point2D::* Process::getCoord)() const; 

Vous pouvez fournir un initialiseur:

double (Point2D::* Process::getCoord)() const = &Point2D::getX; 
+0

Merci, je l'ai écrit dans l'ordre inverse: double (Processus: : Point2D :: * getCoord)() const = & Point2D :: getX; – Ian

Questions connexes