我遇到了以下问题。我有一节课:
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
所以这个想法没有用。怎么了?我能以某种方式做我想做的事情(保持课程独立)吗?
答案 0 :(得分:4)
您需要绑定指向该对象的指针。我建议使用std::function
和std::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
指针的存在方式。
因为该方法隐式期望一个表示对象的指针参数,所以不能只使用常规函数指针。