2

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

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

我还有另一个我想要(并且出于某种原因需要)完全独立于 class 的类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

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

4

2 回答 2

4

您需要将指针绑定到对象。我建议使用std::functionand std::bind。这将导致代码更简洁,除非出于某种原因您绝对必须使用原始函数指针。

这是一个例子。这超出了记忆,因此它可能不完全正确,但它确实向您展示了使用std::function. 请注意,这是在 C++11 中添加到标准库中的。如果您有一个非常旧的编译器(甚至 GCC 4.4 也支持函数式编译器),您将需要使用 Boost。在这种情况下,只需将下面的所有stds替换为 s 即可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);
于 2012-08-24T03:54:18.170 回答
2

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

void MyClass::foo(int, int);

实际上是

void foo(MyClass*, int, int)

尽管您通常可以使用调试器看到效果,但这种转换在编译器中无缝进行。this毕竟,指针就是这样存在的。

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

于 2012-08-24T03:56:41.683 回答