设置一个类实例的功能,它已经定义

问题描述:

我想给类事件函数,如.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" ; 
    } 
+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

是的,这是可能的。

您需要使用函数指针或封装函数指针和其他可调用对象的封装器,如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(); 
} 
+2

+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的特定功能。

+0

请注意,与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; 
}