c++ - 被函数指针迷惑为类中另一个函数的参数

标签 c++ function-pointers

我被函数指针迷住了

这是一个示例代码:

#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/

相关文章:

C++ 在类构造函数中定义一个常量成员变量

c++ - 如何创建相互返回的 C++ 函数?

c++ - 一个类应该使用函数指针调用另一个类的方法

C++:通用函数包装类作为非模板类​​的成员

c++ - C++ 中的 vector 存储

c++ - 将字符范围转换为 int

c++ - C API函数的风格

c++ for循环不同的方式

c - C 中的函数指针是如何工作的?

C++解析复杂文件,其中每一行指定一个命令