返回指针时,如果找不到则返回什么? C ++

时间:2009-11-12 00:02:55

标签: c++ vector return-value default-value

我不确定该作为默认值返回什么内容?

myDrugs是一个私人vector<Drug*>容器

Drug* DrugDealer::getFirstDrugInSack(DrugType drugtobuy)
{
    for (int i = 0; i < myDrugs.size(); i++)
    {
        if (myDrugs[i]->getType() == drugtobuy)
            return myDrugs[i];
    }

    return 0; // is this right?
}

所以我会这样称呼:

Drug *d = DrugDealer->getFirstDrugInSack(DrugType::Weed);
if (d != 0)
    // do something
else
    // onose?

或者有更好的方法吗?

7 个答案:

答案 0 :(得分:13)

我想说这取决于函数期望来找到值,这取决于你的函数是如何定义良好和内聚,以及什么类型合同它提供给客户代码。

如果没有找到该值是可以接受的,我会说在这种情况下返回一个NULL指针是一种向客户端代码指示无法找到该值的方法。

如果异常情况没有找到值,这表明存在问题,可能以下方法之一更好:

  • 抛出例外
  • 断言并返回NULL。通常不建议单独断言,因为这些(通常)是从发布版本中编译的。

在你的情况下,我会说返回NULL是可以接受的,但如上所示,这会对每种情况都有所改变,并且没有特别的“经验法则”适用于此处。

答案 1 :(得分:6)

有些人喜欢NULL为0.你也可以提出异常。

答案 2 :(得分:4)

返回NULL是好的。您也可以考虑将指针作为参数传递给指针并返回布尔值,如果找到则返回true,否则返回false:

bool DrugDealer::getFirstDrugInSack(DrugType drugtobuy, Drug** out)
{
    for (int i = 0; i < myDrugs.size(); i++)
    {
        if (myDrugs[i]->getType() == drugtobuy) {
           *out = myDrugs[i];
           return true;
        }

    }

    return false;
}

通话:

Drug* d;
if (dealer->getFirstDrugInSack(dragType, &d)) {
  // Found it, use it
}

答案 3 :(得分:1)

Drug *myDrug = NULL;
In the loop, myDrug = myDrugs[i] followed by break;
and return myDrug.

答案 4 :(得分:1)

我会说你有三个选择:

  1. 返回0
  2. 抛出异常
  3. 使用Null对象模式
  4. 1)如果你想避免异常,你必须测试0的缺点。如果您编写现代C ++代码,因为它会使代码跳跃(很多if),并且异常会使代码变慢,如果返回0的情况不那么可能(那么它不是真的例外;-))

    2)同样的事情,如果情况不太可能,还有一种方法

    3)这将使代码在所有情况下都起作用,只有在你必须检查是否有药物的情况下,你必须与定义的NullObject进行比较,而不是0。这也可以通过使用{来解决。 {1}}(已成为新C ++标准库的一部分,如果你有一个较旧的STL,你可以使用std::shared_ptr,它只是一个标题模板类)

    仅供参考:我收集了我能找到的设计模式,并将它们放入可列表的列表中 http://www.color-of-code.de/index.php?option=com_content&view=article&id=68:software-patterns&catid=43:design&Itemid=66维基百科有我可以找到的条目的反向链接。

    编辑:此处仅为空对象模式的链接:http://en.wikipedia.org/wiki/Null_Object_pattern

答案 5 :(得分:0)

是的,这没关系。如果没有对象的情况不会经常发生,并且处理这些对象的代码变得复杂,请考虑使用异常。

答案 6 :(得分:0)

您可以使用的另一个选项是返回NullObject

返回Drug :: NullDrug;

基本上是一个被认为是“NUll”的有效药物对象意味着如果你使用它,它就不会破坏。

虽然一般我会回来0;

阱,

通常,我会使用智能ptrs。