2010-11-20 28 views
2

私は以下のクラスを持っていますC++ポインタ、宣言

1]静的クラスメンバ関数

:機能それは typedefを使用するのが最善だ FAQによると
Process.h 

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

2]非クラスのメンバ関数

Process.h 

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

class Process 
{ 
    private: 
     ... 
}; 

答えて

1

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

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

初期化:

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

'プロセス:: getCoord =&Point2Dの::のgetX:

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

あなたは初期化子を提供することができますあなたがそれを持っている場所では有効ではありません。それは定義になっていたのだろうか? –

+0

問題は、ポインタgetCoordを宣言/初期化する方法でした。私はそれを宣言する方法を最初に書いて、それをどのように初期化するかを書きました。 – Dialecticus

+0

宣言を変更しましたが、その定義が欠落しているとは考えられません(問題のリンクエラーの原因が不足している可能性が高い)か、初期化(割り当ては初期化と同じではありません)あなたが見せたいことを理解していない? –

2

唯一のy関数の名前をそれがメンバであるクラス名で修飾することではありません。 Process::getCoordの定義を提供する代わりに、getCoordと呼ばれるメンバーへのグローバルポインターを宣言しました。全くタイプが存在しないとして、それだけ割り当ての `有効な定義(または宣言)ではありません。

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

ありがとう、私はそれを逆の順序で書いた: :Point2D :: * getCoord)()const =&Point2D :: getX; – Ian