我试图给出类事件函数,如.onShow()和.onHide(),所以当显示对象时,.onShow()函数将运行。我怎样才能让函数像这样改变:
MyClass myInst = MyClass();
myInst.onShow = OnShowFunction;
是否可以允许这个?
答案 0 :(得分:6)
您可以使用函数指针或std::function
(也在BOOST中)来实现此目的。但是,看起来您可能正在尝试在C ++中采用javascript或脚本语言编程风格 - 我警告过,您应该根据它如何适应语言来改变您的编程风格。 C ++中的一个典型替代方法是使onShow
虚拟方法可被衍生物覆盖。
答案 1 :(得分:3)
您可能不希望在运行时动态更改函数,如果您这样做,则其他答案之一将向您展示如何使用仿函数。但对我来说,听起来你希望不同的对象根据对象的某些属性具有不同的功能。
这就是虚函数的用途:
您可以在基类中定义操作。然后在派生类中,根据对象的行为方式给出实际的实现。
class MyClass
{
public:
virtual void onShow() = 0;
};
class Window: public MyClass
{
public:
virtual void onShow() { /* Draw Window */ }
};
void aboutToShowObject(MyClass& obj)
{
obj.onShow();
}
答案 2 :(得分:1)
是的,这是可能的。
您需要使用函数指针或封装函数指针和其他可调用对象的包装器,如function
,它可以在C ++ 0x,C ++ TR1和{{3}中以各种形式找到}。
根据您使用回调的方式,Boost等信号库可能会更优雅。
答案 3 :(得分:1)
这就是你如何做到这一点(并同时给你的同事留下深刻印象/恐惧):
#include <iostream>
class MyClass
{
public:
void (MyClass::*OnShow)() ;
void OnShowFunction() ;
} ;
int main (int argc, char** argv)
{
MyClass C ;
C.OnShow = MyClass::OnShowFunction ;
(C.*C.OnShow)() ;
}
void MyClass::OnShowFunction()
{
std::cout << "void MyClass::OnShowFunction()\n" ;
}
答案 4 :(得分:0)
你可以使用std :: function这是一个包装类,它可以让你以安全的方式分配函子和C函数。
但是,在这里使用仿函数Hierarchy是一个非常简单的解决方案。
class Object
{
BaseOnShow& onShow;
}
class onShow1 : BaseOnShow { ... };
class onShow2 : BaseOnShow { ... };
...
Object obj;
onShow1 OnShowFunction; // careful about the lifetime of this one
obj.onShow = OnShowFunction;
然后,像往常一样,必须通过虚函数成员使用onShow的特定功能。
答案 5 :(得分:0)
如果要在运行时动态更改函数指针,可以将函数指针保持为成员,并使用名为OnShow()的默认方法调用函数指针:
#include <iostream>
using namespace std;
void OnShow() {
cout << "Showing!" << endl;
}
typedef void(*EventProc)();
class Widget {
private:
EventProc m_ep;
public:
Widget() : m_ep(0) {}
void SetOnShow(EventProc ep) {m_ep = ep;}
void OnShow() {(*m_ep)();}
};
int main() {
Widget w;
w.SetOnShow(::OnShow);
w.OnShow();
return 0;
}