Bamboozled由函数指针作为类中另一个函数的参数

时间:2016-03-15 01:28:33

标签: c++ function-pointers

我通过函数指针 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);

2 个答案:

答案 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);