2

次のコードを書きました。

#include <iostream>
using namespace std ;
class C{
 public:
   C::C(int) ;
   int f1(int);
   int f2(int);
   int (*f)(int);   
}

int C::f1(int x){
   return -x ;
}

int C::f2(int x){
   return x;
}

C::C(int c){
  if (c<0){
    f = f1 ;
   }
  else {
    f = f2 ;
  }
}

このコードは機能しませんが、コンストラクターに渡される値に応じて、メソッドを toまたは tofに割り当てるという考え方です。f1f2

C++でこれを達成するにはどうすればよいですか?

4

2 に答える 2

5

メンバー関数が静的でない場合はf、メンバー関数ポインターとして宣言する必要があります。

int (C::*f)(int);

mclass のメンバー関数の名前を指定すると、次のように記述Cしてメンバー関数へのポインターを取得します。m

&C::m

あなたの場合:

if (c<0){
    f = &C::f1;
}
else {
    f = &C::f2;
}

完全なコードを含む実際の例を次に示します。

メンバーへのポインターを介してメンバー関数を呼び出すにfは、演算子->*orを使用する必要があります.*。例えば:

int main()
{
    C c(42);
    (c.*(c.f))(1729);

    int (C::*fxn)(int) = c.f;
    (c.*fxn)(0);

    C* p = &c;
    (p->*fxn)(123);
}

または、 の特定のメンバー関数内fxnからC:

void C::fxn()
{
    // ...      
    (this->*f)(6);
}

一方、関数f1()f()が の特定のインスタンスで動作する必要がない場合はC、 の宣言とのコンストラクターのfコードをそのままにしておくことができますが、 とを次のようにマークする必要があります。Cf1()f2()static

class C
{
public:
   C(int);
   static int f1(int);
// ^^^^^^
   static int f2(int);
// ^^^^^^
   int (*f)(int);
};
于 2013-06-12T22:02:40.287 に答える
0

通常はこれを行うことができますが、f1 と f2 を static としてマークする必要があります。それ以外の場合、通常は関数ポインターに格納できない this ポインターが必要です。

class C
{
public:
    C(int);
    static int f1(int);
    static int f2(int);
    int (*f) (int);
};

int C::f1(int x)
{
    return -x;
}

int C::f2(int x)
{
    return x;
}

C::C(int c)
{
    if (c < 0) {
        f = f1;
    } else {
        f = f2;
    }
}
于 2013-06-12T22:02:08.463 に答える