在已经定义了类实例的函数之后设置它

时间:2010-09-05 20:01:22

标签: c++ winapi

我试图给出类事件函数,如.onShow()和.onHide(),所以当显示对象时,.onShow()函数将运行。我怎样才能让函数像这样改变:

MyClass myInst = MyClass();
myInst.onShow = OnShowFunction;

是否可以允许这个?

6 个答案:

答案 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;
}