我想调用一个函数指针,指向一个来自外部所述类的成员函数(函数指针也是同一个类的成员)。
不幸的是,以下内容会产生错误:
错误:标识符“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
的正确语法是什么?
答案 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::bind
与this
一起使用,因为它是您的成员函数。