如何在不同的类中使用函数指针

How to use function pointers in different classes?

本文关键字:函数 指针      更新时间:2023-10-16

请检查以下代码。为什么它是错误的以及如何修复?非常感谢。

class A
{
  public:
    class B
    {
      public:
        B(int(*cf)())
        {
            f = cf;
        }
        int (*f)();
    };

    B *b;

    A()
    {
        b = new B(this->a);
    }

    int a()
    {
    }
};
int main()
{
    A a;
}

编译错误:

如果绝对需要通过指针调用函数,则需要使用指向成员函数的指针,而不是指向函数的指针。指向成员函数的指针具有不同的声明语法,其中包括函数所属的类类型。在您的情况下,参数声明看起来像int (A::*cp)()。您还需要将f成员变量的声明更改为int (A::*f)()

为了调用指向成员函数的指针,您需要有一个指向该函数所属类型的对象的指针。您还需要使用指向成员运算符的指针之一;->*.*

void call(A* c, int (A::*f)())
{
    (c->*f)(); // call member function through pointer
}

由于运算符的优先顺序,需要额外的一组括号。

以下代码包括使用指向成员函数的指针所需的更改。

class A
{
public:
    class B
    {
    public:
        // Take a pointer to member function.
        B(int(A::*cf)())
        {
            f = cf;
        }
        void call(A* c)
        {
            (c->*f)();
        }
        int (A::*f)();  // pointer to member function
    };

    B *b;

    A()
    {
        b = new B(&A::a);
    }

    int a()
    {
        return 0;
    }
};
int main()
{
    A a;
    a.b->call(&a);
}

我还建议您考虑使用std::functionstd::bind(或者如果您没有C++11编译器,则使用它们的Boost等价物)。

使用C++时,首先不要使用函数指针。

有一个更简单、更简洁的解决方案——界面。

class Interface {
   public:
      virtual int CallMe() = 0;
};
class B : public Interface { int CallMe() { return 5; };
class A : public Interface {
   private:
      Interface *m_i = 0;
   public:
      A(Interface *i) : m_i(i) { }
      A() : m_i(this) { };
      void DoIt() { cout << m_i->CallMe() << endl; }
      int CallMe() { return 8; }
};
int main() {
   A a(new B); // Coult be any object that implements Interface (as yes it is a memory leak
   A aa();
   a.DoIt(); // Will print 5
   aa.DoIt(); // WIll print 8
   return 0;
}