2010-11-20 17 views
2

Ich habe die folgende Klasse:C++ Zeiger auf Elementfunktion, Erklärung

class Point2D 
{ 
protected: 

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

und Zeiger auf die Member-Funktion in einer anderen Klasse deklariert:

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

Wie/initlialize Zeiger auf das Element erklären Funktion:

1] statische Klassenmitgliederfunktion

Process.h 

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

2] non-Klasse-Memberfunktion

Process.h 

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

class Process 
{ 
    private: 
     ... 
}; 

Antwort

1

Nach dem FAQ ist es am besten typedef zu verwenden:

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

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

Initialisierung:

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

'Prozess :: getCoord = & Point2D :: getX;' ist keine gültige Definition (oder in der Erklärung), da es keine Art ist, es ist nur eine Zuordnung Ausdruck so nicht gültig, wo Sie es haben. Sollte es eine Definition sein? –

+0

Die Frage war, wie man den Zeiger getCoord deklariert/initialisiert. Ich habe zuerst geschrieben, wie man es deklariert und dann wie man es initialisiert. – Dialecticus

+0

Sie haben die Deklaration geändert, aber ich sehe keine Definition (deren Fehlen wahrscheinlich die Ursache für den Linkfehler in der Frage war) oder eine Initialisierung (Zuweisung ist nicht dasselbe wie Initialisierung), vielleicht nicht Verstehst du nicht, was du zu zeigen versuchst? –

2

Das einzige, was y Dies wurde nicht getan, um den Namen der Funktion mit dem Klassennamen zu qualifizieren, zu dem sie gehört. Anstatt eine Definition von Process::getCoord bereitzustellen, haben Sie einen globalen Zeiger auf Member mit der Bezeichnung getCoord deklariert.

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

können Sie einen Initialisierer bieten:

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

Danke, ich schrieb es in umgekehrter Reihenfolge: double (Prozess: : Point2D :: * getCoord)() const = & Point2D :: getX; – Ian