在《大规模C++程序设计》这本书中谈到了迭代器模式。
他提供了这样的一个迭代器的例子
|
这个for循环中判断终止的写法,有点意思,做一下记录。
这个地方的本质是这样的:C++ 编译器,将it 转换为 (void*)it 观察是否是非0值。
之所以能转换,是因为重载了 void* 操作符。
- 用vs新建一个win32控制台工程
- 代码如下,代码将无法编译
// operatorTest.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include <iostream> using namespace std; class CTest {
public:
};
int _tmain(int argc, _TCHAR* argv[]) { CTest t;
if (t) { cout<<"true"<<endl; }
return 0; } |
会有错误提示如下
- 修改CTest
// operatorTest.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include <iostream> using namespace std; class CTest { public:
operator void*() { return this; } };
int _tmain(int argc, _TCHAR* argv[]) { CTest t;
if (t) { cout<<"true"<<endl; }
return 0; } |
问题就解决了。解决的原因如开头所述,编译器将 if(t) => if((void*)t)
- 在实际应用中,当然不能像上述例子这样返回this,必须考虑,某个条件成立,返回非0值,否则返回0.
此次,我们修改CTest,让返回值与成员有关。
// operatorTest.cpp : 定义控制台应用程序的入口点。 //
#include "stdafx.h" #include <iostream> using namespace std; class CTest { public: int d_Value; CTest() { d_Value = 0; }
operator void*() { if (d_Value < 100) return (void*)1; else return (void*)0; //或者返回NULL } };
int _tmain(int argc, _TCHAR* argv[]) { CTest t;
while(t) { cout<<"当前dvalue的值是:"<<t.d_Value++<<endl; }
return 0; } |
- 最后
重载操作符的使用,如大规模C++程序设计这本书所说,对于不了解类设计的人。理解起来比较费劲。
因此要慎重考虑。