2012-03-30 20 views
4

クラス内に関数ポインタを定義しようとしていますが、クラスのインスタンスを通じてアクセスしようとしていますが、エラーが表示されます。ここでクラス内の関数ポインタへのアクセス

は、コードは次のとおりです。

1 #include<stdio.h> 
2 
3 class pointer { 
4 public: 
5 int (pointer::*funcPtr)(int); 
6 pointer() { 
7  funcPtr = &pointer::check; 
8 } 
9 
10 
11 int check(int a) 
12 { 
13  return 0; 
14 } 
15 
16 }; 
17 
18 int main() 
19 { 
20 pointer *pt=new pointer; 
21 return (pt->*funcPtr)(3); 
22 } 

これは、コンパイル時のエラーを示しています

checkPointer.cpp:21:15: error: ‘funcPtr’ was not declared in this scope 

私を助けてください。

ありがとうございます。

+0

+1スタックオーバーフローへようこそ!完全で簡潔なテストケースを提供していただきありがとうございます。なぜ誰もがそれをしたかった理由については、http://sscce.orgを参照してください。 –

答えて

2

ここで問題となるのは、funcPtrがpt内で宣言されているため、ptを2回使用する必要があります.1回はポインタをメンバ選択の左側に、もう一度ポインタクラスを選択するそこからfuncPtrを選択する:

(fn->*(fn->funcPtr))(3); 

この理由は、あなたが潜在的に機能がポインタの別のインスタンス上のポインタの1つのインスタンスのfuncPtrメンバーが指す呼び出すことができることです。

希望すると便利です。

+0

私はreturn(pt - > * pt-> pointer :: funcPtr)(3)を意味すると思います。 – fschmitt

+0

@ fschmitt-私はそう信じません。 funcPtrは、選択したいptのデータメンバーの名前です。スコープ解決を使用して、メンバ関数へのポインタを選択する必要はありません。 – templatetypedef

1

を意味だと思います。通常は、その著者はtypedef sおよび#defineのを回避しますが、この場合のために、彼は例外になり:

#define CALL_MEMBER_FN(object,ptrToMember) ((object).*(ptrToMember)) 
… 
    CALL_MEMBER_FN(*pt, pt->funcPtr)(3) 

P.S.をあなたがそれらの指示に従わなくても、そのページを読んでください。メンバー関数へのポインタに関する有益な情報が満載です。

関連する問題