所以我从Java/C#转向C++相当混乱.虽然我觉得我理解了大部分的基础知识,但是在我的理解中存在一些巨大的漏洞.
例如,考虑以下功能:
Fruit&
FruitBasket::getFruitByName(std::string fruitName)
{
std::map<std::string,Fruit>::iterator it = _fruitInTheBascit.find(fruitName);
if(it != _fruitInTheBascit.end())
{
return (*it).second;
}
else
{
//I would so love to just return null here
}
}
Run Code Online (Sandbox Code Playgroud)
哪里_fruitsInTheBascit是std::map<std::string,Fruit>.如果我查询getFruitByName("kumquat")你知道它不会在那里 - 谁吃金橘?但我不希望我的程序崩溃.在这些情况下应该做些什么?
PS告诉我任何其他我尚未确定的愚蠢行为.
在C++中没有这样的东西作为空引用,所以如果函数返回引用,则不能返回null.你有几个选择:
更改返回类型,以便函数返回指针; 如果找不到该元素,则返回null.
保留引用返回类型但有一些"sentinel"fruit对象,如果找不到该对象,则返回对它的引用.
FruitNotFoundException如果在地图中找不到水果,请保留引用返回类型并抛出异常(例如).
我倾向于使用(1)如果可能发生故障,(3)如果不可能发生故障,则"可能"是完全主观的测量.我认为(2)有点像黑客,但我看到它在某些情况下使用得很整齐.
作为"不太可能"的失败的一个例子:在我当前的项目中,我有一个管理对象的类,并且有一个函数is_object_present可以返回一个对象是否存在以及一个get_object返回该对象的函数.我总是希望调用者在调用is_object_present之前通过调用验证对象的存在get_object,因此在这种情况下失败是不太可能的.