【问题标题】:C++: Array of member function pointers to different functionsC++:指向不同函数的成员函数指针数组
【发布时间】:2011-04-03 17:01:55
【问题描述】:

我有一个包含成员函数 foo() 和 bar() 的类 A,它们都返回一个指向类 B 的指针。如何将包含函数 foo 和 bar 的数组声明为类 A 中的成员变量?以及如何通过数组调用函数?

【问题讨论】:

    标签: c++ pointers function


    【解决方案1】:

    成员函数指针语法为ReturnType (Class::*)(ParameterTypes...),例如:

    typedef B* (A::*MemFuncPtr)(); // readability
    MemFuncPtr mfs[] = { &A::foo, &A::bar }; // declaring and initializing the array
    B* bptr1 = (pointerToA->*mfs[0])(); // call A::foo() through pointer to A
    B* bptr2 = (instanceOfA.*mfs[0])(); // call A::foo() through instance of A
    

    参见例如this InformIT article 了解有关指向成员的指针的更多详细信息。

    您可能还想查看 Boost.BindBoost.Function(或它们的 TR1 等效项),它们允许您将成员函数指针不透明地绑定到实例:

    typedef boost::function<B* ()> BoundMemFunc;
    A instanceOfA;
    BoundMemFunc mfs[] = { 
        boost::bind(&A::foo, &instanceOfA), 
        boost::bind(&A::bar, &instanceOfA) 
    };
    B* bptr = mfs[0](); // call A::foo() on instanceOfA
    

    要将这样的数组用作成员,请注意您不能使用成员初始化器列表来初始化数组。因此,您可以在构造函数主体中分配给它:

    A::A {
        mfs[0] = &A::foo;
    }
    

    ...或者您使用可以在此处实际初始化的类型,例如 std::vectorboost::array

    struct A {
        const std::vector<MemFuncPtr> mfs;
        // ...
    };
    
    namespace {
        std::vector<MemFuncPtr> init_mfs() {
            std::vector<MemFuncPtr> mfs;
            mfs.push_back(&A::foo);
            mfs.push_back(&A::bar);
            return mfs;
        }
    }
    
    A::A() : mfs(init_mfs()) {}
    

    【讨论】:

    • @DeadMG:我提到了 TR1 版本,但我选择了 Boost 版本,因为它具有最广泛的可用性。我个人认为 C++0x 版本还不够普及,新标准也尚未最终确定。
    • 啊,你做到了。由于我自己有一个 C++0x 编译器,所以我不习惯看到 boost 变体。
    【解决方案2】:

    您正在寻找的是指向成员函数的指针。下面是一个简短的示例,展示了它们的声明和使用:

    #include <iostream>
    
    class B {
    public:
      B(int foo): foo_(foo) {
        std::cout << "Making a B with foo_ = " << foo_ << std::endl;
      }
      ~B(void) {
        std::cout << "Deleting a B with foo_ = " << foo_ << std::endl;
      }
      int foo_;
    };
    
    class A {
    public:
      A(void) {
        funcs_[0] = &A::foo;
        funcs_[1] = &A::bar;
      }
    
      B* foo(void) {
        return new B(3);
      }
    
      B* bar(void) {
        return new B(5);
      }
    
      // Typedef for the member function pointer, for everyone's sanity.
      typedef B* (A::*BMemFun)(void);
      BMemFun funcs_[2];
    };
    
    int main(int argc, char *argv[]) {
      A a;
      for (int i = 0; i < 2; ++i) {
        A::BMemFun func = a.funcs_[i];
        // Call through the member function pointer (the .* operator).
        B* b = (a.*func)();
        delete b;
      }
      return 0;
    }
    

    C++ FAQ section on pointers to member functions 是我找到所有这些信息的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多