使用指向类方法的指针作为函数的参数,但用作函数指针,而不是指向方法的指针

Using pointer to class method as argument to the function, but as a function pointer, not pointer to the method

本文关键字:指针 函数 方法 类方法 参数      更新时间:2023-10-16

我遇到了以下问题。我有一门课:

class My_Class
{
    public:
    My_Class(void);  // constructor
    double * Return_Values(double x, double y);  // returns a pointer to the array
}

我还有另一个类,我希望(出于某种原因需要)与类My_Class保持完全独立,但它有一个方法,需要一个类似于My_Class::Return_Values(double x, double y)的函数。所以我决定尝试传递一个函数指针:

class Independent_Class
{
    public:
    Independent_Class(); // constructor
    void Crazy_Method(int a, int b, double * (*FunctionToOperate)(double,double));
}

现在我在代码的主体中做以下操作:

double * (My_Class::*pt2Member)(double,double) = NULL;                
pt2Member = &My_Class::Return_Values;
Fields = (My_Class_instance.*pt2Member)(0.0,0.0); // this works perfectly

现在我试着作弊(是的,我知道函数指针和指向类成员的指针不一样,但我还是试过了)。

double * (*func)(double,double);
func=pt2Member;     // Doesn't work
Independent_Class_instance.Crazy_Method(1,1, &(My_Class_instance.*pt2Member))  //Doesn't work

所以这个想法没有奏效。怎么了?我能以某种方式做我想做的事吗(保持类的独立性)?

您需要绑定一个指向对象的指针。我建议使用std::functionstd::bind。这将导致更干净的代码,除非出于某种原因您必须使用原始函数指针。

下面是一个例子。这会从内存中消失,所以它可能并不完全正确,但它确实向您展示了std::function的简单性。请注意,这已添加到C++11中的标准库中。如果您有一个非常旧的编译器(即使GCC 4.4也支持函数),您将需要使用Boost。在这种情况下,只需将所有std替换为下面的boost即可。

#include <functional>
class Independent_Class
{
    public:
    Independent_Class(); // constructor
    void Crazy_Method(int a, int b, std::function<double* (double,double)> FunctionToOperate);
}

std::function<double* (double, double)> func; 
func = std::bind(&My_Class::Return_Values, My_Class_instance, _1, _2);
Independent_Class_instance.Crazy_Method(1,1,func);

类的方法采用一个隐式参数,该参数表示指向调用该方法的对象的指针。即方法

void MyClass::foo(int, int);

实际上是

void foo(MyClass*, int, int)

这种转换在编译器中无缝地发生,尽管您经常可以通过调试器看到效果。毕竟,这就是this指针的存在方式。

因为该方法隐含地期望一个表示对象的指针参数,所以不能只使用正则函数指针。