2012-02-19 4 views
0

私は関数へのポインタの概念を習得しようとしています。私は解読できなかったエラーを投げているコードを書いた。このプログラムをコンパイルするには見た目関数へのポインタエラーコンパイル中

 # include<iostream> 
    # include<stdio.h> 
    # include<conio.h> 

    using namespace std; 
    typedef int(*pt2Func)(int,int); 

    class A 
    { 
      private : int x; 
        int y; 
      public: 
        A(){} 
        A(int a, int b) 
        { 
        x=a; 
        y=b; 
        } 
        int sum(int a, int b){return a+b;} 
        int sub(int a , int b){return a-b;} 
        int mult(int a, int b){return a*b;} 
        pt2Func GetPtr2(const char c) 
        { 
         if (c == '+') 
         return &sum; // line 25 
         else if(c== '-') 
         return &sub; // line 27 
         else if(c=='*') 
         return &mult; //line 29 
        } 
        void pass_ptr(int (*pointer_fn)(int,int)) 
        { 
        int result; 
        result=(*pointer_fn)(10,5); 
        cout << " result is : " << result; 
        } 
        ~A(){} 
    }; 

    int main() 
    { 
     A a(0,5); 
     pt2Func=(a.GetPtr2)('+');   //line 43 
     int result = (a.*pt2Func)(5,10); //line 44 
     cout << "result is " << result; 
     getch(); 
     return 0; 
    } 

を持ってください、私はライン25,27,29に次のエラーを取得:

cannot convert `int (A::*)(int, int)' to `int (*)(int, int)' in return 

私はまた、ライン43と

ある44でエラーが出ます
expected primary-expression before='token' 
+1

ヒント:扱います'typedef'を作り、それを使ってください。 –

+1

typedefをtypedefとして宣言していますint(A :: * pt2Func)(int、int);いくつかのエラーを取り除いていますが、私はまだ次のようなエラーが出ています。-ISO C++では、非修飾または括弧で囲まれた非静的メンバー関数のアドレスを取ってメンバー関数へのポインタを作成することを禁じています。言って&A :: sum'' – Invictus

答えて

2

class A;         // <-- forward declaration 
typedef int (A::*pt2Func)(int,int); 

return &sum;return &A::sum;に置き換えて、定義したタイプに一致するようにする必要があります。

そして、あなたはまた、これらの回線交換する必要があります。これらと

pt2Func=(a.GetPtr2)('+');   // <-- pt2Func is type, name of variable is missing 
int result = (a.*pt2Func)(5,10); // <-- type name (pt2Func) is not allowed here 

:それが動作するように意図していたとして、それは動作します

pt2Func ptr = a.GetPtr2('+'); 
int result = (a.*ptr)(5, 10); 

を;)

+0

ありがとうトンLihO :) – Invictus

1

Pointers-to-member-functionは、ポインター間関数と同じではありません。私はこのトピックに特化したC++ FAQセクションを読むことをお勧めします:[33] Pointers to member functions

1

機能sum()は、非静的メンバー関数であり、タイプはint (*)(int,int)ではありません。タイプはint (A::*)(int,int)です。コンパイラのエラーメッセージに表示されています。他の2つの関数、すなわちsubmultについても同様です。

2つの解決策があります。簡単な解決策は、あなたのプログラム内のすべてのものは、以下を除いて、あまり変化せずに動作します、これらの機能にstaticメンバ関数を作ることです。

//pt2Func=(a.GetPtr2)('+'); //line 43 - error 
pt2Func=a.GetPtr2('+');  //line 43 - corrected 

//int result = (a.*pt2Func)(5,10); //line 44 - error 
int result = pt2Func(5,10);  //line 44 - corrected 
3

ポインタの機能にpointer to (non-static) member functionsと同じではありません。

あなたのプログラムを修正するには、いくつかの方法がありますが、私はそれらを概説します:

  • 利用無料の機能または静的の代わりに、メンバ関数
  • 変化型メンバへのポインタ((A::*)(int, int)
  • 使用std::function/std::bindあなたがしてtypedef int(*pt2Func)(int,int);を交換する必要が