将成员函数传递给另一个对象的成员函数C ++

时间:2015-03-24 18:35:50

标签: c++ function-pointers member-function-pointers member-functions

我在尝试将函数作为参数传递给另一个对象的函数时遇到了问题。我很清楚有很多类似的主题,但我要么无法让他们的解决方案起作用,要么无法理解它们。

class foo
{
public:
    void func1(void (*Drawing)(void));

    template<class T>
    void func2(void (T::*Drawing)(void));
};

class bar
{
private:
    foo myFoo;
    void Drawing();
    void func3() {
        // Attempt 1
        myFoo.func1(Drawing);

        // Attempt 2
        myFoo.func2<bar>(&bar::Drawing);
    }
};

所以在我的第一次尝试中,我得到了错误,你可以将void (bar::*)(void)转换为void (*)(void),然后我发现它有正常的函数指针和成员函数指针。

尝试2是我努力克服这个问题,但我现在得到了未解决的外部...

那么如何才能成功将Drawing()成员函数从另一个对象传递到另一个函数?

2 个答案:

答案 0 :(得分:5)

问题在于您不能将bar::Drawing视为void (*)(void)函数,因为它是非静态方法,因此需要一个对象(将使用this上下文)

一个解决方案,假设c ++ 11对你来说没问题,那就是使用std::bind并轻松修改你的foo定义:

class foo
{
    public:
    void func1(std::function<void(void)> Drawing)
    {
        Drawing(); // or do whatever you want with it
    }
};

然后你就可以了

void bar::func3() {
    myFoo.func1(std::bind(&bar::Drawing, this));
}

使许多潜在用途有效

int main()
{
    bar myBar;
    myBar.func3();

    foo myFoo;
    myFoo.func1([](){ printf("test\n"); });
    return 0;
}

答案 1 :(得分:0)

我猜你已经遗漏了关于你想要完成什么的重要细节。但是,以下内容可以让您了解自己需要做些什么。

代码

#include <iostream>

class foo
{
public:
    void func1(void (*Drawing)(void))
    {
        std::cout << "func1\n";
    }

    template<class T>
    void func2(T* instance, void (T::*fn)(void))
    {
        std::cout << "func2: ";
        (instance->*fn)();
    }
};

class bar
{
public:
    bar()
    {
        func3();
    }

private:
    foo myFoo;

    void Drawing()
    {
        std::cout << "bar::Drawing()\n";
    }

    void func3()
    {
        // Attempt 1
        //myFoo.func1(Drawing); // This won't work

        // Attempt 2
        myFoo.func2(this, &bar::Drawing); // Must pass an object instance if you plan to use the member function
    }
};

int main(int argc, char *argv[])
{
    bar b;

    return 0;
}

样本输出

func2: bar::Drawing()