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

时间:2012-08-24 03:49:29

标签: c++ function-pointers

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

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

所以这个想法没有用。怎么了?我能以某种方式做我想做的事情(保持课程独立)吗?

2 个答案:

答案 0 :(得分:4)

您需要绑定指向该对象的指针。我建议使用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);

答案 1 :(得分:2)

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

void MyClass::foo(int, int);

实际上是

void foo(MyClass*, int, int)

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

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