我试图将指向成员函数的指针传递给非成员函数,如下例所示:
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,包括其函数签名) )。
谢谢!
答案 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 ) );
}
};