将成员函数分配给函数指针

时间:2015-06-02 19:54:32

标签: c++ function-pointers

如果我有两个这样的课程:

class A
{
    public:
        int *(*fun)( const int &t );
        A( int *( *f )( const int &t ) ) : fun( f ) {}
};

class B
{
    private:
        float r;

        int *f(const int &t)
        {
            return new int( int( r ) + t );
        }
        A a;
        B() : a( A( f ) ) {}
};

这会导致编译错误。

我想将f分配给a的函数指针。

问题在于A可以被许多类使用,而不仅仅是B,所以我不能简单地将fun定义为B::*fun

我在互联网上找到的帖子和stackoverflow上的帖子都没有解决使用函数指针的问题,这些函数指针有很多类,每个类都有自己的成员函数但是原型相同。

那该怎么办?

3 个答案:

答案 0 :(得分:3)

  

这导致编译器错误

因为fA的非静态成员函数返回int*,所以它接受对int的单个const引用。这意味着,它的类型不是:

int* (*)(const int &);

但:

int* (A::*)(const int&);

此外,您的代码表示非常糟糕的设计 - 我认为您需要简单的虚拟功能。但是如果你想继续用这种方式写作,你可能需要阅读:ISOCPP: Pointers to members

请记住,C类型的非静态成员函数总是接受类型C*(或const C*的其他隐式参数,如果函数是使用const限定符声明的话) ,指向C此实例的实例被调用。

答案 1 :(得分:2)

您的代码看起来很混乱,而且我个人认为 C函数指针 C ++的OO实现上看起来很难看。所以我建议你使用std::function。它仅在C++11后才可用。如果您无法使用它,请尝试查看Boost's Implementation

我可以举例说明如何使用std::function

bool MyFunction(int i)
{
    return i > 0;
}

std::function<bool(int)> funcPointer = MyFunction;

使用它可以大大提高代码的可靠性。至于你的问题,特别是:

class A
{
public:
    std::function<int*(const int&)> fun;
    A(std::function<int*(const int&)> f) : fun(f) {}
};

class B
{
private:
    float r;
    int *f(const int &t)
    {
        return new int(int(r) + t);
    }
    A *a;
    B()
    {

        std::function<int*(const int&)> tempFun = std::bind(&B::f, this, _1);
        a = new A(tempFun);
    }
};

您必须添加以下命名空间:

using namespace std::placeholders;

答案 2 :(得分:1)

  

那该怎么办

不多。除了在对象类型上模板化A,它将保存一个指向成员函数的指针,该函数接受一个const int并返回指向int的指针。

您要做的是将指向自由函数的指针与指向成员函数的指针混合。虽然听起来它们都是函数指针,但它们的不同之处在于它们无法通过相同的类型定义。