C++并返回null - 在Java中工作的东西在C++中不起作用

JnB*_*ymn 0 c++ null

所以我从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)

哪里_fruitsInTheBascitstd::map<std::string,Fruit>.如果我查询getFruitByName("kumquat")你知道它不会在那里 - 谁吃金橘?但我不希望我的程序崩溃.在这些情况下应该做些什么?

PS告诉我任何其他我尚未确定的愚蠢行为.

Jam*_*lis 9

在C++中没有这样的东西作为空引用,所以如果函数返回引用,则不能返回null.你有几个选择:

  1. 更改返回类型,以便函数返回指针; 如果找不到该元素,则返回null.

  2. 保留引用返回类型但有一些"sentinel"fruit对象,如果找不到该对象,则返回对它的引用.

  3. FruitNotFoundException如果在地图中找不到水果,请保留引用返回类型并抛出异常(例如).

我倾向于使用(1)如果可能发生故障,(3)如果不可能发生故障,则"可能"是完全主观的测量.我认为(2)有点像黑客,但我看到它在某些情况下使用得很整齐.

作为"不太可能"的失败的一个例子:在我当前的项目中,我有一个管理对象的类,并且有一个函数is_object_present可以返回一个对象是否存在以及一个get_object返回该对象的函数.我总是希望调用者在调用is_object_present之前通过调用验证对象的存在get_object,因此在这种情况下失败是不太可能的.

  • @Nathan:在任何定义良好的程序中,您都不能有空引用,因为获取空引用的唯一方法是取消引用空指针(就像您在注释中显示的那样).取消引用空指针会导致未定义的行为. (2认同)