C ++,将成员指针传递给非成员函数

时间:2015-11-22 11:42:39

标签: c++ pointers member

我试图将指向成员函数的指针传递给非成员函数,如下例所示:

class Main
{
    static void runMain (void (*progress)(double))
    {
        for (int i=1; i<=100; ++i)
        {
            // Do something
            progress(i/100.0);
        }
    }
};

class A
{
    void setProgress (double) {/*Do something else*/}
    void runA ()
    {
        Main::runMain (&setProgress); // Error: incompatible parameter from void(A::*)(double) to void(*)(double)
    }
};

class B
{
    void updateProgress (double) {/*More things to do*/}
    void runB ()
    {
        Main::runMain (&updateProgress); // The same error
    }
};

由于从A传递到Main的类型函数void(A :: *)(double)与void(*)(double)不匹配,此结果出错。

如何在以下约束下传递成员函数:我不允许更改类A和B的结构,但runA和runB实现除外(但我可以更改类Main,包括其函数签名) )。

谢谢!

1 个答案:

答案 0 :(得分:-2)

所以,可能你通常用C#编写代码。 在C ++中,指向函数(或静态函数)的指针与指向类的方法(成员函数)的指针不兼容。

也许passing-member-function-as-argument会帮助你。

可能的解决方案之一:

class IProgressUpdater {
public:
    virtual void updateProgress( double ) = 0;
};

class Main
{
public:
    static void runMain ( IProgressUpdater* progressUpdater )
    {
        for (int i=1; i<=100; ++i)
        {
            // Do something
            progressUpdater->updateProgress( i/100.0 );
        }
    }
};

class A : public IProgressUpdater
{
    virtual void updateProgress( double ) {/*Do something else*/}
    void runA ()
    {
        Main::runMain( static_cast<IProgressUpdater*>( this ) );
    }
};

class B : public IProgressUpdater
{
    virtual void updateProgress( double ) {/*More things to do*/}
    void runB ()
    {
        Main::runMain( static_cast<IProgressUpdater*>( this ) );
    }
};