0

このようなことは可能ですか?静的関数を使用しないかchordL、のメンバーを作成しpowerます。やり方がよくわからないのですが、できないのでしょうか?

class power {
  double b;     

public:
  void set(double par){b=par}     

  double fun(double arg){
    return b*pow(arg,2); 
  } 

  double execute(double par1, double par2);
};

double chordL(power::*fm, double p1, double p2){      // it's not a member function
  return sqrt(pow(fm(p1)-fm(p2),2)+pow(p1-p2,2));  // clearly doesn't work! 
}

double power::execute(double par1, double par2){     // it's a member function
  double (power::*g)(double);
  g=&power::fun;
  return chordL(g,par1,par2);
}
4

3 に答える 3

3

そんなことはできません。メンバー関数 (宣言されていないstatic) には、特別な/非表示の引数 がありthisます。正しい型のオブジェクトがある場合は、それを関数と共に渡し、メンバー関数呼び出しに必要なあいまいな構文を使用して呼び出すことができます。

 double chordL(power* tp, double (power::*fm)(double), double p1, double p2)
 ...
     (tp->*fm)(p1); 


double power::execute(double par1, double par2){     // it's a member function
  double (power::*g)(double);
  g=&power::fun;
  return chordL(this, g,par1,par2);
}

編集: 呼び出しコードを追加し、chordL 関数に渡し、以前の投稿からオブジェクトと関数ポインターの順序を入れ替えました -最初の引数としてthis渡す方が理にかなっています。thisそして、関数ポインタの引数を修正しました。

于 2013-07-02T09:45:30.067 に答える
0

power次のように関数ポインターを呼び出すには、のインスタンスが必要です。

double chordL(T& instance, T::*fm, double p1, double p2){
    return sqrt(pow(instance.*fm(p1) - instance.*fm(p2), 2) + pow(p1 - p2, 2));
}
于 2013-07-02T09:44:31.677 に答える