我创建了一个名为Map的双链表模板化类,它接受一个名为MapItem的结构,它有两个模板化变量(键和值),并对它们执行某些功能。截至目前,我的所有函数都工作,除了这个名为get的函数,它接受一个键和布尔变量作为参数,并且:返回与键关联的值,如果找到键则将布尔变量设置为true,或者不是返回任何内容并将布尔变量设置为false。当我在main中调用这个函数时,它会不断崩溃,我的思绪会被错误所困扰。让我知道你们的想法!
template <class keyType, class valueType>
valueType Map<keyType, valueType>::get(keyType key, bool & success) const
{
if(sizeList == 0) //if the list is empty, set success to false since there is nothing to return
success = false;
else if(sizeList == 1) //if one item, check it to see if it's the one we're looking for
{
if(head->key == key) //if it is the item, return the value
{
success = true;
return head->value;
}
else
success = false;
}
else //if the size of the list is greater than 1, increment through it
{
int i = 1;
struct MapItem<keyType, valueType> *temp = head; //store head in temp as the first item to check and increment through all the items
while(i <= sizeList)
{
if(temp->key == key) //if we found it
{
success = true;
return temp->value;
}
temp = temp->next; //get the next item
i++;
}
}
success = false;
}
这里是我正在讨论的结构MapItem,它在Map类中用于存储项目:
template <class keyType, class valueType>
struct MapItem
{
keyType key;
valueType value;
MapItem<keyType, valueType> *prev, *next;
};
是的,我知道函数get没有返回语句,如果它实际上没有找到密钥,但是我们的教授说它应该是OKAY但是在这一点上我开始不这么认为。可以实现错误异常来处理这个吗?感谢。
答案 0 :(得分:0)
您的函数在失败时不返回值。这是一个错误:
6.6.3返回语句
[stmt.return]
[...]
流出函数末尾相当于没有值的返回;这导致未定义 值返回函数中的行为。
侧面观察:
不要使用out-parameter返回错误成功,而是考虑使用std::tuple<bool, valueType>
。
如果构建失败时的主要返回值是不可接受的,请抓取std::experimental::optional
的预发行版(有时会在TC中跟随C ++ 14)。
Boost-implementation已经很好用了:http://www.boost.org/doc/libs/master/libs/optional/doc/html/index.html
第三种选择是在失败时抛出异常。