gpt4 book ai didi

关于类设计异常处理的 C++ 帮助

转载 作者:行者123 更新时间:2023-11-30 01:23:28 26 4
gpt4 key购买 nike

我目前正在学习 C++ 并通过实现一个简单的地址簿应用程序来练习我的知识。
我从一个Entry 类和一个AddressBook 类开始,它们实现了一个STL 映射以通过人员的姓氏访问条目。
现在我得到了以下代码:

Entry AddressBook::get_by_last_name(string last_name){
if(this->addr_map.count(last_name) != 0){
//What can I do here?
} else {
return addr_map[last_name];
}

在脚本语言中,我只会返回类似-1, Error Message(Python 中的列表)的内容,以指示函数失败。我不想抛出异常,因为它是应用程序逻辑的一部分。调用类应该能够通过在控制台上打印一些内容或打开一个消息框来响应请求。
现在我考虑通过引入某种在 C++ 中实现脚本语言方法Entry 的无效状态。但在 C++ 中这不是不好的做法吗?难道是我的全类设计就是不合适?我感谢任何帮助。请记住,我仍在学习 C++。

最佳答案

关于您的代码的一些快速注释:

if(this->addr_map.count(last_name) != 0){
//What can I do here?

你可能想要另一种方式:

if(this->addr_map.count(last_name) == 0){
//handle error

但你真正的问题在于:

return addr_map[last_name];

这里需要注意两点:

  1. map 的operator[] 可以做两件事:如果元素存在,则返回它;如果该元素不存在,它会使用指定的键和值的默认构造函数创建一个新的(键,值)。可能不是你想要的。但是,如果您之前的 if 语句是正确的方式,那么后者将永远不会发生,因为我们会事先知道 key 存在。
    1. 在调用 count() 之前,您有效地告诉 map 尝试查找元素。通过调用 operator[],您告诉 map 再次找到它。因此,您需要做两倍的工作来检索单个值。

更好(更快)的方法涉及迭代器和 find 方法:

YourMap::iterator it = addr_map.find(last_name); //find the element (once)
if (it == addr_map.end()) //element not found
{
//handle error
}
return *it.second; //return element

现在,回到手头的问题。如果找不到 last_name 怎么办?正如其他答案所指出的:

  • 最简单的解决方案是返回一个指针(如果找不到则返回 NULL)
  • 使用boost::optional
  • 简单地返回 YourMap::iterator 但似乎您正试图对 AddressBook 的用户“隐藏”map 所以那可能是个坏主意。
  • 抛出一个异常。但是等等,现在您必须首先检查调用此方法是否“安全”(或在适当的时候处理 exception)。此检查需要像 lastNameExists 这样的 bool 方法,它必须在调用 get_by_last_name 之前调用。当然,然后我们回到方 block 1。我们正在执行 2 个查找操作来检索单个值。它是安全的,但是如果你对 get_by_last_name 进行了很多调用,那么这可能是一个使用不同解决方案进行优化的好地方(此外,可以说异常不是很有建设性:What's wrong with searching对于不存在的东西,是吧?)。
  • Entry 创建一个 dummy 成员,表明它不是真正的 Entry 但这是非常糟糕的设计(难以管理、违反直觉、浪费 - 随便你怎么说)。

如您所见,前 2 个解决方案更可取。

关于关于类设计异常处理的 C++ 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14935835/

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