我被函数指针迷住了。
这是一个示例代码:
#include <iostream>
class test
{
inline
void output_plumber_1(int* const arg_out, const int* const arg_in)
{
*arg_out = -*arg_in;
}
inline
void input_plumber_1(int* const arg_out, const int* const arg_in)
{
*arg_out = 2 * (*arg_in);
}
inline
void member_func(void (test::*output_plumber)(int* const arg_out, const int* const arg_in),
void (test::*input_plumber)(int* const arg_out, const int* const arg_in),
int arg)
{
int arg_copy;
(*input_plumber)(&arg_copy, &arg);
arg_copy = arg_copy + 1;
int arg_out;
(*output_plumber)(&arg_out, &arg_copy);
std::cout << arg_out << std::endl;
}
public:
void execute(int arg)
{
void (test::*output_plumber)(int* const arg_out, const int* const arg_in) = &test::output_plumber_1;
void (test::*input_plumber)(int* const arg_out, const int* const arg_in) = &test::input_plumber_1;
member_func(output_plumber, input_plumber, arg);
}
};
int main()
{
test mytest;
mytest.execute(1);
return 0;
}
应该做什么?
这是一个相当精简的示例,但本质上我有一个程序,其中包含一个类,该类的成员函数对某些输入数据进行操作。在执行操作之前和执行操作之后,必须将数据输入到一组输入和输出“水管工”函数中,这些函数修改数据以准备“操作”发生,并“对其进行一些处理以纠正进行“手术后的初步准备”。
我的程序中出现了这种情况,因为我正在使用对数据对 (x, y) 进行运算的算法,这些数据仅在 x > y 时有效。 (奇怪?但事实就是如此。)
有什么问题?
大概很多,但是编译器的直接输出如下:
main.cpp: In member function ‘void test::member_func(void (test::*)(int*, const int*), void (test::*)(int*, const int*), int)’:
main.cpp:27:11: error: invalid use of unary ‘*’ on pointer to member
(*input_plumber)(&arg_copy, &arg);
^
main.cpp:32:11: error: invalid use of unary ‘*’ on pointer to member
(*output_plumber)(&arg_out, &arg_copy);
最佳答案
这个:
void (test::*output_plumber)(int* const arg_out, const int* const arg_in)
是指向test
成员函数的指针,它有两个参数并返回void
。指向成员的指针只是指向给定的成员变量或函数,但在类的上下文之外没有任何意义。所以你不能在没有实例的情况下调用一个。
两个允许的语法是:
(obj.*ptr)(args...)
(p_obj->*ptr)(args...)
取决于实例是否是指针。所以调用指针的正确语法是:
(this->*input_plumber)(&arg_copy, &arg);
(this->*output_plumber)(&arg_out, &arg_copy);
调用函数的正确方法是:
test_obj.member_func(&test::output_plumber_1, // <-- pointer to member
&test::input_plumber_1, // <-- pointer to member
0);
关于c++ - 被函数指针迷惑为类中另一个函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36001107/