从类C ++外部调用成员指针到成员方法

时间:2017-08-28 12:39:47

标签: c++ class pointers

我想调用一个函数指针,指向一个来自外部所述类的成员函数(函数指针也是同一个类的成员)。

不幸的是,以下内容会产生错误:

  

错误:标识符“function_pointer”未定义

#include <iostream>

class test_class {
public:
    void (test_class::*function_pointer)(int);
    void test_function(int input) {
        std::cerr << input << std::endl;
    }
    test_class() {
        function_pointer = &test_class::test_function;
    }
};

int main(void) {
    test_class foo;
    (foo.*function_pointer)(5);
    return 0;
}

我可以在课堂上调用它,但我想避免不必要的混乱。

#include <iostream>

class test_class {
public:
    void (test_class::*function_pointer)(int);
    void test_function(int input) {
        std::cerr << input << std::endl;
    }
    test_class() {
        function_pointer = &test_class::test_function;
    }
    void call_from_within(int input) {
        (this->*function_pointer)(input);
    }
};

int main(void) {
    test_class foo;
    foo.call_from_within(5);
    return 0;
}

简而言之:从课堂外调用function_pointer的正确语法是什么?

3 个答案:

答案 0 :(得分:2)

(foo.*foo.function_pointer)(5);

访问成员(function_pointer)您需要指定他们属于哪个实例

作为一个更复杂的例子,为什么需要这样做:

test_class foo, bar;
(foo.*bar.function_pointer)(5);

答案 1 :(得分:1)

使用 Gruffalo 的解决方案,或者将该函数指针声明放在类外

class test_class{
    ...
};
void (test_class::*function_pointer)(int);

答案 2 :(得分:1)

除了其他答案。

由于它是c++,您也可以使用std::function。 (有关详细信息,请参阅here

#include <iostream>
#include <functional>

class test_class{
public:
    std::function<void(int)> function_pointer;

    void test_function(int input)
    {
      std::cerr << input << std::endl;
    }

    test_class()
    {
      function_pointer = std::bind(&test_class::test_function, this, std::placeholders::_1);
    }
};

int main(void)
{
  test_class foo;

  foo.function_pointer(5);

  return 0;
}

注意:您必须将std::bindthis一起使用,因为它是您的成员函数。