gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:06:14 26 4
gpt4 key购买 nike

一点背景:

我目前正在完成我的 OOP 类(class)的作业,其中包括围绕各种设计模式设计和实现电话簿管理器。

在我的项目中,所有操作都围绕着 3 个类进行:

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

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

我最初是如何决定实现的:

我遇到的所有设计模式书籍都推荐对接口(interface)进行编码,因此我的第一个想法是从上述每个类中提取一个接口(interface),然后让它们实现它。

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

问题:

  • 这种设计的主要挫折是我失去了互操作性用 STL <algorithm>以及 range 提供的语法糖基于 for 循环。

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

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


解决这个问题的最简单方法(据我所知)是避免在可迭代类型上使用接口(interface),以适应我自己的 STL 兼容迭代器。这会增加耦合度,但我不确定从长远来看它是否真的会产生任何影响(当然不是说这个项目很快就会变成丢弃代码)。我的猜测是它不会,但是,在我继续我的设计之前,我也想听听长辈们的意见。

最佳答案

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

首先,对联系人的迭代非常简单,因为它是一种单一类型的迭代,您只需提供 beginend 方法即可对基础字段进行迭代。

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

关于c++ - 在 C++ 中,可迭代类型应该是非多态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16529176/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com