【问题标题】:How to call a function using pointer-to-member-function如何使用指向成员函数的指针调用函数
【发布时间】:2011-07-10 06:53:33
【问题描述】:

我有一堂课:

class A {
    void test_func_0(int);
    void run();

    typedef void(A::*test_func_t)(int);

    struct test_case_t{
       test_func_t test_func;
    } test_case[100];
};

现在我想在 run() 中调用 test_func():

void A::run() 
{
    test_case[0].test_func = &test_func_0;
    test_case[0].*(test_func)(1);
}

无论我尝试什么组合,我的代码的最后一行都不起作用(编译错误)。

【问题讨论】:

标签: c++ function function-pointers member-function-pointers


【解决方案1】:

使用这个:

void A::run() 
{   
    test_case[0].test_func = &A::test_func_0;
    (this->*(test_case[0].test_func))(1);
}

请注意,您有 2 个错误。第一个是你如何形成成员函数指针。请注意,唯一的方法是使用&ClassName::FuncName,无论您是否在班级范围内。 & 也是强制性的。

第二个是当你通过成员函数指针调用成员时,你必须明确指定调用成员函数的对象(在你的例子中是 A 类型)。在这种情况下,您必须指定this(因为这是一个指针,我们使用->* 而不是.*)

HTH

【讨论】:

    【解决方案2】:

    用途:

    (this->*test_case[0].test_func)(1);
    

    【讨论】:

      【解决方案3】:

      使用指向成员函数的指针调用成员函数:

       test_case[0].test_func = &A::test_func_0; //note this also!
      (this->*test_case[0].test_func)(1);
      

      演示:http://www.ideone.com/9o8C4

      【讨论】:

      • test_func 是 A:: 成员,而不是 test_case_t 成员。
      • @Erik:是的。我注意到。其实我是在ideone上测试的。所以更正并发布了指向 Ideone 的链接!
      猜你喜欢
      • 2010-12-28
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      相关资源
      最近更新 更多