Chinaunix首页 | 论坛 | 博客
  • 博客访问: 438299
  • 博文数量: 67
  • 博客积分: 2468
  • 博客等级: 上尉
  • 技术积分: 1050
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-05 01:21
文章分类

全部博文(67)

文章存档

2013年(1)

2012年(65)

2011年(1)

分类: C/C++

2012-08-03 17:08:45

在《C++ GUI Qt4编程》第二版,4.5节 实现其他菜单 中,简单介绍了仿函数。
喜欢这本书的风格,以应用程序为例,来让大家学习Qt。在4.5节中是以spreadsheet为例。
在spreadsheet.h中SpreadsheetCompare类是这样定义的。

点击(此处)折叠或打开

  1. class SpreadsheetCompare
  2. {
  3. public:
  4.     bool operator()(const QStringList &row1,
  5.                     const QStringList &row2) const;

  6.     enum { KeyCount = 3 };
  7.     int keys[KeyCount];
  8.     bool ascending[KeyCount];
  9. };

另外在spreadsheet.cpp中对SpreadsheetCompare类的“()”符号进行了重载。这样就允许把这个类像函数一样使用。把这样的类称为函数对象,或者称为仿函数。

点击(此处)折叠或打开

  1. bool SpreadsheetCompare::operator()(const QStringList &row1,
  2.                                     const QStringList &row2) const
  3. {
  4.     for (int i = 0; i < KeyCount; ++i) {
  5.         int column = keys[i];
  6.         if (column != -1) {
  7.             if (row1[column] != row2[column]) {
  8.                 if (ascending[i]) {
  9.                     return row1[column] < row2[column];
  10.                 } else {
  11.                     return row1[column] > row2[column];
  12.                 }
  13.             }
  14.         }
  15.     }
  16.     return false;
  17. }

这样就可以像下面这样使用:

点击(此处)折叠或打开

  1. QStringList row1, row2;
  2. SpreadsheetCompare compare;
  3. ...
  4. if (compare(row1, row2)) {
  5.     //row1 is less than row2
  6. }

4.5节里还举了这样一个简单的例子。

点击(此处)折叠或打开

  1. class Square
  2. {
  3. public:
  4.     int operator()(int x) const { return x * x; }
  5. }
Square类提供了一个函数,operator()(int)函数,它返回其参数的平方值。通过把这个函数命名为operator()(int),而不是将其命名为compute(int)之类的函数,就可以把一个类型为Square的对象当作一个函数。

点击(此处)折叠或打开

  1. Square square;
  2. int y = square(5);
  3. //y equals 25

阅读(892) | 评论(1) | 转发(0) |
0

上一篇:我感觉到的C或者C++

下一篇:UI框架

给主人留下些什么吧!~~

时间看来2012-08-03 17:19:09

仿函数只是面向对象重载功能耍的一个小花招~