使用指向类方法的指针作为函数的参数,但用作函数指针,而不是指向方法的指针
Using pointer to class method as argument to the function, but as a function pointer, not pointer to the method
我遇到了以下问题。我有一门课:
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::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);
类的方法采用一个隐式参数,该参数表示指向调用该方法的对象的指针。即方法
void MyClass::foo(int, int);
实际上是
void foo(MyClass*, int, int)
这种转换在编译器中无缝地发生,尽管您经常可以通过调试器看到效果。毕竟,这就是this
指针的存在方式。
因为该方法隐含地期望一个表示对象的指针参数,所以不能只使用正则函数指针。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址