在C ++中,可迭代类型应该是非多态的吗?

时间:2013-05-13 18:56:59

标签: c++ oop design-patterns polymorphism

一些背景知识:

我目前正在从我的OOP课程中完成一项任务,其中包括围绕各种设计模式设计和实施电话簿管理员。

在我的项目中,有3个类围绕着所有动作发生:

  • PhoneBook;
  • Contact(存储在电话簿中的类型);
  • ContactField(存储在Contact中的字段)。

ContactManager必须提供一种在两种模式下迭代其联系人的方法:基于谓词进行过滤和过滤; Contact必须提供迭代其字段的方法。

我最初决定如何实施:

我遇到的所有设计模式书籍都建议编写一个界面,所以我首先想到的是从上面的每个类中提取一个界面,然后让它们实现它。

现在我还必须创建某种多态迭代器以使事情变得平滑,所以我调整Java iterator interface来编写前向迭代器。

问题:

  • 这种设计的主要挫折是我失去了互操作性 与stl <algorithm>和范围提供的句法糖 基于循环。

  • 我遇到的另一个问题是Iterator<T>::remove()功能。如果 我想要一个可以改变它迭代的序列的迭代器 (删除元素)然后一切都很好,但如果我不想要 这种行为我不确定该怎么做。

    我看到在Java中可以抛出UnsupportedOperationException 如果不是,那就不好了(如果我错了,请纠正我) 如果没有处理异常,则应用程序终止并且a 显示堆栈跟踪。在C ++中,你真的没有那么奢侈 (除非你认为附带调试器运行)并且说实话 我宁愿在编译时捕获这样的错误。


这个混乱的最简单的出路(我看到)是为了避免在可迭代类型上使用接口以适应我自己的stl兼容迭代器。这将增加耦合但是我不确定它从长远来看实际上是否会产生任何影响(当然,这个项目很快就会丢掉代码)。我的猜测是,但在我继续设计之前,我还想听听老人的意见。

1 个答案:

答案 0 :(得分:1)

我可能采取略微不同的方法。

首先,对联系人的迭代非常简单,因为它只是一种迭代类型,你可以提供beginend方法来允许对底层字段进行迭代。

对于PhoneBook上的迭代,我仍然只提供正常beginend,然后提供for_each_if函数您只使用迭代感兴趣的联系人,而不是尝试提供跳过无趣元素的超自定义迭代器。