设置一个类实例的功能,它已经定义
我想给类事件函数,如.onShow()和.onHide(),所以当对象显示时,.onShow()函数将运行。我怎样才能让功能如此变化:设置一个类实例的功能,它已经定义
MyClass myInst = MyClass();
myInst.onShow = OnShowFunction;
是否有可能允许这样做?
这是你如何做到这一点(和打动/在同一时间吓坏你的牛orkers):
#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" ;
}
是的,这是可能的。
您需要使用函数指针或封装函数指针和其他可调用对象的封装器,如function
,它可以在C++ 0x,C++ TR1和Boost中以各种形式找到。
根据您使用回调的方式,像Boost.Signals这样的信号库可能更优雅。
您可以使用函数指针或std::function
(也在BOOST中)来实现此目的。然而,看起来你可能正试图在C++中采用JavaScript或脚本语言编程风格 - 我会警告你,你应该改变你的编程风格,取决于它如何适应语言。 C++中的一个典型替代方法是使onShow
为可由衍生工具覆盖的虚拟方法。
您可能不希望在运行时动态更改函数,如果您确实需要,其他答案之一会告诉您如何使用函子。但对我来说,这听起来像你想让不同的对象根据对象的某些属性具有不同的功能。
这是虚函数是:
你定义在基类的动作。然后在派生类中,根据对象的行为方式给出实际的实现。
class MyClass
{
public:
virtual void onShow() = 0;
};
class Window: public MyClass
{
public:
virtual void onShow() { /* Draw Window */ }
};
void aboutToShowObject(MyClass& obj)
{
obj.onShow();
}
+1并注意当马丁说,你不会在运行时这样改变功能,它不意味着你没有选择你想在运行时创建哪个对象。您仍然可以根据上下文创建一个派生类或另一个派生类。 Functor或者类似std :: function的包装只有在对象的生命周期中想要更改函数时才有用。 – log0 2010-09-05 20:47:26
您可以使用std :: function这是一个包装类,它可以让您以安全的方式指定函数和C函数。
但是,使用函子层次结构是一个非常简单的解决方案。
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的特定功能。
请注意,与Martin的回答相比,onShow的生命周期不同于obj的生命周期。 – log0 2010-09-05 21:10:27
如果要动态地改变在运行时函数指针,你可以保持函数指针成为会员,并使用)调用该函数指针称为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;
}
谢谢TonyK,我得到了这个工作完全我只是做了一些改变:void OnShowFunction(){/ *做的东西* /} class MyClass { public: void(* OnShow)(); }; int main(int argc,char ** argv) { MyClass C; C.OnShow = OnShowFunction; (* OnShow)(); } – 2010-09-05 21:55:00