WEB开发网
开发学院软件开发VC 事件编程(二) 阅读

事件编程(二)

 2007-03-15 21:54:00 来源:WEB开发网   
核心提示: class NotifyProgress {protected:UINT m_nFound;public:NotifyProgress(UINT n) : nFound(n) { }void operator()(IPrimeEvents* obj){obj->OnProgress(
class NotifyProgress {
protected:
 UINT m_nFound;
public:
 NotifyProgress(UINT n) : nFound(n) { }
 void operator()(IPrimeEvents* obj)
 {
  obj->OnProgress(nFound);
 }
};  
  NotifyProgress 实现函数 operator()(IPrimeEvents*),它是 for_each 算法需要的东西。一般来讲,如果你具备一个类型为 T 对象集合,for_each 会需要一个实现 operator()(T) 的仿函数(functor)。它调用该集合中 T 对象的这个操作符。所以这里函数 operator 有一个 IPrimeEvents 指针参数并返回 void —— 因为客户机列表是一个 IPrimeEvents 指针列表。为了传递附加参数,构造函数将它们保存在数据成员里。NotifyProgress(nFound) 调用构造函数以创建一个用 m_nFound=nFound 初始化的堆栈实例。所以,任何触发 Foo 事件的 Foo 仿函数的一般模式是这样的:class NotifyFoo {
protected:
 ARG1 m_arg1; // whatever, as many as needed
public:
 NotifyProgress(ARG1 a1, ...) : m_arg1(a1) { }
 void operator()(IMyEvents* obj)
 {
  obj->OnFoo(m_arg1, ...);
 }
};  
  构造函数将事件参数作为数据成员来保存,函数 operator 将它们传递到对象事件处理函数。对于所有仿函数来说,最终结果是——将函数 OnFoo 转换为类 NotifyFoo。这样做为什么会有用呢?因为我能编写一个模板。在我开始做之前,有一件事我必须得提一下。那就是你必须从一个叫 unary_function 的 STL 类派生你的仿函数类:

class NotifyProgress :
 public unary_function
{
 .
 . // as before
 .
};  
  也就是说,NotifyProgress 是一个一元函数,其函数 operator 带一个参数,IPrimeEvents 指针并返回 void。该一元函数使你的仿函数类“可适配”,使你能将它与 STL 适配器,如:not1、bind2nd 等等进行结合。但是即使你从来都没有打算使用适配器,就像我的事件处理例程,unary_function 仍然不失为一个好主意,因为它向这个世界宣告:“这是一个函数类。”它是一种将代码文档化的方式。有关适配器的详细讨论,参见 Effective STL:50 Specific Ways to Improve Your Use of the Standard Template Library (Addison-Wesley, 2001) by Scott Meyers

上一页  1 2 3 4 5 6  下一页

Tags:事件 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接