在类构造函数中传递函数代码

时间:2014-09-16 09:07:10

标签: c++

我想知道是否可以将代码函数传递给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;
}

背后的想法是我想要一个比较函数,我可以在创建对象时实例化。

非常感谢!

4 个答案:

答案 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; 
    });