Kia*_*ian 2 c++ exception operator-overloading
我正在编写一个程序,我已经创建了一个POD结构的std :: vector.结构的一个成员是唯一标识符.
为了能够使用std :: binary_search,我必须为struct实现operator <.遵循这里的指导原则,我正在为==,!=,<,>,> =和<=编写完整的重载集.
这提出了一个我不确定如何处理的问题.向量将按照我为每个结构分配的唯一ID进行排序.如果两个结构具有相同的标识符,则它们是相同的.但是,如果两个结构具有相同的标识符但其他成员中的数据不同,则会出现这种情况.
这绝不应该发生.让比较运算符检查其余字段然后抛出异常(如果它们不同但ID是相同的)是否合适?什么样的例外最合适?
这仅仅是SCombinator答案的扩展.
事实,你说"这应该永远不会发生." 意味着您要使用断言,而不是异常(或两者的组合).一个例外可以隐藏错误 - 好吧,不要隐藏,但你将能够捕获它并继续.它更适合您没有真正计划的特殊情况 - 例如您尝试打开不存在的文件.它不是文件丢失的逻辑的一部分,它是你的小弟弟意外删除你的文件,或者是一种认为它是病毒的侵略性反病毒,或者其他什么 - 这只是一种特殊的情况.
如果具有相同ID但不同的成员是永远不会发生的事情,那基本上就是一个断言.它是逻辑的一部分 - 如果你愿意的话,也是要求的一部分.抛出异常只是指出了这一点,但实际上并没有办法从中恢复.当你意识到出现问题时,它已经迟到了.你有两个具有相同id但又不同的对象,你不知道哪个是正确的,你不知道为什么存在不正确的对象,依此类推.你可能甚至不想从中恢复.应用程序已经处于错误状态 - 两个相互矛盾的对象已经存在.您的应用程序处于无法恢复的状态 - 如果继续使用它,您可能会得到错误的结果或更糟.
如果它不是一个关键的断言,你也可以在之后抛出一个异常,并提供一个干净的方式来关闭应用程序,但这只是一个美化.
一般来说,我遵循一个简单的规则 - 如果它是在特殊情况下可能发生的事情,我会使用例外.如果它是永远不会发生的事情,如果它确实存在,意味着代码中的逻辑严重错误,我使用断言(可能是强制崩溃).
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |