2011-02-01 15 views
3

test.calculateの関数ポインタ代入(と多分残ったもの)を動作させるにはどうすればよいですか?同じオブジェクトのメンバ関数へのC++関数ポインタの割り当て

#include <iostream> 

class test { 

    int a; 
    int b; 

    int add(){ 
     return a + b; 
    } 

    int multiply(){ 
     return a*b; 
    } 

    public: 
    int calculate (char operatr, int operand1, int operand2){ 
     int (*opPtr)() = NULL; 

     a = operand1; 
     b = operand2; 

     if (operatr == '+') 
      opPtr = this.*add; 
     if (operatr == '*') 
      opPtr = this.*multiply; 

     return opPtr(); 
    } 
}; 

int main(){ 
    test t; 
    std::cout << t.calculate ('+', 2, 3); 
} 

答えて

8

コードにはいくつかの問題があります。

まず、int (*opPtr)() = NULL;は、メンバー関数へのポインタではなく、フリー関数へのポインタです。このようにメンバ関数ポインタを宣言します。はこのように、メンバ関数のアドレスを撮るとき

int (test::*opPtr)() = NULL;

第二に、あなたはクラスのスコープを指定する必要があります。

if (operatr == '+') opPtr = &test::add; 
if (operatr == '*') opPtr = &test::multiply; 

を最後に、コールしますメンバ関数ポインタを介して特別な構文があります。

return (this->*opPtr)(); 

ここには複雑ですete作業例:

#include <iostream> 

class test { 

    int a; 
    int b; 

    int add(){ 
     return a + b; 
    } 

    int multiply(){ 
     return a*b; 
    } 

    public: 
    int calculate (char operatr, int operand1, int operand2){ 
     int (test::*opPtr)() = NULL; 

     a = operand1; 
     b = operand2; 

     if (operatr == '+') opPtr = &test::add; 
     if (operatr == '*') opPtr = &test::multiply; 

     return (this->*opPtr)(); 
    } 
}; 

int main(){ 
    test t; 
    std::cout << t.calculate ('+', 2, 3); 
} 
+0

ありがとう、ちょうど私の日を救った。 – toochin

+1

@PeterMortensen:その男*ではない。誰もその男を好きではない。 –

3

このようにint (test::*opPtr)() = NULL;http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1

編集を参照してください。また、if (operatr == '+') opPtr = &test::add;の代わりに、[..] = this.addreturn (this->(opPtr))();の代わりreturn opPtr();を使用しています。実際には、クラスメンバーabではなく、FAQやおそらくメンバ関数のパラメタのようなtypedefとマクロを使用してください。

+0

真実ですが、これ以上の問題があります。 –

関連する問題