如何从其他类调用功能指针

How to Call function pointer from other class

本文关键字:调用 功能 指针 其他      更新时间:2023-10-16

,假设我有一些简单的函数指针的简单类,例如:

class ClassWithFuncPointer
{
public:
   inline void firstFunction() { /* do something */ };
   inline void secondFunction() { /* do something */ };
   // MY FUNCTION POINTER
   void (ClassWithFuncPointer::*funcPointer) ();
   // AND I CAN DEFINE IT BY DEFAULT IN CONSTRUCTOR LIKE THAT:
   ClassWithFuncPointer()
   {
       funcPointer = &ClassWithFuncPointer::firstFunction;
   }
   // AND NOW I CAN USE MY FUNCTION POINTER INSIDE OF ClassWithFuncPointer, LIKE THAT:
   void useFunctionPointer()
   {
       (this->*funcPointer )();
   }
}

所以在这里(this->*funcPointer )();做这项工作。

,但我无法弄清楚如何使用其他班级的funcPointer,我的意思是这样:

class otherClass
{
    otherClass(){};
    ClassWithFuncPointer instanceOfClassWithFuncPointer;
}

现在如何在instanceOfClassWithFuncPointer成员的otherClass内使用funcPointer。根本可能吗?

我尝试了许多变体:

(this->*instanceOfClassWithFuncPointer.funcPointer)();

(instanceOfClassWithFuncPointer.*funcPointer)();

( (&instanceOfClassWithFuncPointer)->*funcPointer )();

或只是

instanceOfClassWithFuncPointer.funcPointer();

,但始终会出现错误。我无法弄清楚。

如下(C 11或较新)呢?

auto fp = instanceOfClassWithFuncPointer.funcPointer;
(instanceOfClassWithFuncPointer.*fp)();

或也(C 98兼容,也许使用较短的变量名称)?

(instanceOfClassWithFuncPointer.*instanceOfClassWithFuncPointer.funcPointer)();

以下是一个完整的工作示例

#include <iostream>
struct ClassWithFuncPointer
 {
   public:
      inline void firstFunction ()
       { std::cout << "cwfp::firstFunction()" << std::endl; }
      inline void secondFunction () 
       { std::cout << "cwfp::secondFunction()" << std::endl; }
      void (ClassWithFuncPointer::*funcPointer) ();
      ClassWithFuncPointer()
       { funcPointer = &ClassWithFuncPointer::firstFunction; }
      void useFunctionPointer()
       { (this->*funcPointer )(); }
 };
class otherClass
 {
   public:
      otherClass ()
       { }
      ClassWithFuncPointer instanceOfClassWithFuncPointer;
      void foo ()
       {
         auto fp = instanceOfClassWithFuncPointer.funcPointer;
         (instanceOfClassWithFuncPointer.*fp)();
       } 
 };
int main ()
 {
   otherClass  oc;
   oc.foo();
 }