2

I wrote the following code:

#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 ;
  }
}

This code doesn't work, but the idea is that I want the method f to be assigned either to f1 or to f2 depending on the value passed to the constructor.

How can I achieve this in C++?

4

2 回答 2

5

如果您的成员函数是非静态的,那么您必须声明f为成员函数指针:

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

m给定class 的成员函数的名称C,您可以通过以下方式获得成员函数指针m

&C::m

在你的情况下:

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

这是一个带有完整代码的实时示例。

然后通过指向成员的指针调用您的成员函数f将需要使用运算符->*.*。例如:

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,则可以保留 as 的声明f以及C构造函数中的代码,但您必须将f1()and标记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 标记为静态。否则他们需要一个通常不能存储在函数指针中的 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 回答