我通过函数指针 bamboozled 。
以下是一个示例代码:
#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> 0时工作。年。 (奇怪的?但事实就是如此。)
什么是问题?
可能很多,但是立即编译输出如下:
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);
答案 0 :(得分:3)
此:
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);
答案 1 :(得分:1)
void (test::*input_plumber)(int* const arg_out, const int* const arg_in),
根据您的问题,您似乎认为上述内容声明了一个参数,它是一个函数指针。
好吧,上面不是函数指针。它是一个类方法指针。它与函数指针不同。
您无法调用input
管道工,就像它是一个函数指针一样:
(*input_plumber)(&arg_copy, &arg);
你不能这样做,因为这不是一个函数指针。我是否提到过这不是函数指针,而是类方法指针?是的,我想我做到了。
要调用方法指针,假设这是您想要执行的操作,您必须通过方法指针找到要调用其方法的类的实例。
告诉您要调用this
的方法:
(this->*input_plumber)(&arg_copy, &arg);
现在,如果你有另一个指向test
的指针,例如:
test *some_ptr_to_test;
您可以类似地调用该对象的方法指针:
(test->*input_plumber)(&arg_copy, &arg);