我想知道是否可以将代码函数传递给c ++中类的构造函数?
class.hpp
class A {
public:
A(void (*f)( parameters ... );
private:
void comp( parameters ...);
}
class.cpp
#include "class.hpp"
A::A(void (*f)( parameters ....) {
&comp = &f;
}
背后的想法是我想要一个比较函数,我可以在创建对象时实例化。
非常感谢!
答案 0 :(得分:1)
是的,无论如何,声明函数指针的语法不是您使用的语法:
class A {
public:
A(void (*f)( int a ) ) : comp(f) {};
private:
void (*comp)( int a ); // Function pointer
};
void comparisonFun(int a) {
//...
}
int main()
{
A obj(comparisonFun);
}
做
class A {
public:
A(void (*f)( parameters ... );
private:
void comp( parameters ...);
}
您宣布了comp
功能。
答案 1 :(得分:0)
以下是您如何做到这一点。定义一种类型的函数指针,如PFN,然后在作为函数指针传递优雅时使用它作为参数类型。
void somefn(int a, char c) {
// do something
}
typedef void (*PFN)(int, char);
class A {
public:
A(PFN pf);
private:
PFN comp;
};
A::A(PFN pf) {
comp = pf;
}
int main()
{
A a(somefn);
return 0;
}
答案 2 :(得分:0)
是的,如果你使成员成为函数指针类型
void (*comp)(/*parameters*/);
并指定值,就像任何其他类型
一样comp = f;
或者,如果您愿意,可以在构造函数的初始化列表
中初始化它A(void (*f)(/*parameters*/)) : comp(f) {}
您可能会发现使用类型别名更方便,因为函数指针类型稍微有点类型
typedef void Comp(/*parameters*/);
Comp * comp;
答案 3 :(得分:0)
您可以使用std::function
并使用lambda表达式初始化函数
class A {
public:
typedef std::function<void(int,int)> CompFun;
A(CompFun f) : comp(f) { }
private:
CompFun comp;
};
然后使用传递给它的lambda调用构造函数:
A a([](int a, int b)
{
return a < b;
});