指向方法的麻烦

1 c++ methods pointers

我只是在学习C++,而且我在指向方法方面遇到了困难.让我们说:

class One {
public:
int Add (int a, int b) {return a+b;}
};

typedef int (One::*pAdd) (int, int);

class Other {
public:
int Next (pAdd funct, int c){ return funct (c, 1);}

};

int main (){

One one;
Other other;

other.Next(one.Add, 2);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我的MinGW的报告,我有很多问题.首先,我没有正确调用函数,因为编译器坚持使用.*或 - >*.不知道如何纳入此请求,欢迎任何帮助.现在,我可以通过使方法静态使用c样式指针或传递对象并从Next中调用方法来解决我的问题,但我想理解指向方法的指针.基本上,我很困惑为什么一个.添加不是一个可接受的输入.调用方法是明确定义的(.Add)并符合我的typedef.另外,我从typedef提供了类(一)的实例,从而提供了执行方法的上下文.但编译器输出看起来我不仅错过了语法,而且我错过了这个概念.那么,如何将指向对象的方法作为上下文作为单个参数传递?

Joã*_*ela 6

这里的主要问题是成员函数不与对象实例相关联,它们只是具有略微不同签名的函数指针.

因此,当您想要调用成员函数时,您需要两件事:指向成员函数指针和调用它的对象实例.

我稍微改了你的代码示例:

#include <iostream>

class One {
public:
    int Add (int a, int b) {return a+b;}
};

typedef int (One::*pAdd) (int, int);

class Other {
public:
    int Next (One one, pAdd funct, int c){
        return (one.*funct)(c, 1);
    }
};

int main (){
    One one;
    Other other;

    std::cout << other.Next(one, &One::Add, 2) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它的作品了.它可能会有所改善,但我认为你可以从这里开始.

我建议你阅读指针到c ++ faq lite的成员函数部分,这很好地解释了这一点.