为什么不能使用对象本身实现一个枚举器的方法「为什么不能使用对象本身实现一个枚举器」
他可能会想着:为什么实现一个对象的枚举器,不能直接使用这个对象本身来实现呢?这样实现起来,不是更加简单吗?
这个说法不正确?为什么?使用代码讲解假设,现在有两个客户同时尝试对你的对象格式进行枚举:那么这两个枚举器实际上是相同的,所以在一个对象上所进行的操作会直接影响另一个对象。例如,考虑下面的看起来有些奇怪的代码段(为了方便对代码进行讲解,我删除了
曾经,我看到有人编写了如下的代码来实现一个枚举器,而在枚举器的定义中,他使用了对象本身来实现。让我们来看看如下的代码:
他可能会想着:为什么实现一个对象的枚举器,不能直接使用这个对象本身来实现呢?这样实现起来,不是更加简单吗?
这个说法不正确?为什么?
使用代码讲解假设,现在有两个客户同时尝试对你的对象格式进行枚举:那么这两个枚举器实际上是相同的,所以在一个对象上所进行的操作会直接影响另一个对象。例如,考虑下面的看起来有些奇怪的代码段(为了方便对代码进行讲解,我删除了一些错误处理代码),这段代码展示了在多个方面看来这个数据对象暴露了相同的数据。
当代码执行到”penum2->Reset()”这个语句时,这将同时意外地重置第一个枚举器。代码中的循环代码会遍历penum2(因为它们使用了同一个对象进行实现,所以也会对penum1进行遍历),当遍历结束的时候,两个枚举器都会到达列表尾部。
这个时候,当我们对第一个枚举器penum1执行Next操作的时候,因为此时penum1已经是尾部了,所以Next操作会立即失败。
这个故事的结局:代码不会像预想的那样查询到任何有用的东西,因为第二个枚举器已经破坏了第一个,遍历的代码压根就不会成功。
总结就如同指针或者引用一样,对指针或引用的操作,将会直接影响对象。你不能释放一个指针两次,就是这个道理。操作系统对待这种逻辑错误,可不会那么仁慈。有道是:崩溃来得越早越好,这样距离直接错误现场就越近,Debug也相对容易。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。本文来自:《Why an object cannot be its own enumerator》
文章评论