我不确定该作为默认值返回什么内容?
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?
或者有更好的方法吗?
答案 0 :(得分:13)
我想说这取决于函数期望来找到值,这取决于你的函数是如何定义良好和内聚,以及什么类型合同它提供给客户代码。
如果没有找到该值是可以接受的,我会说在这种情况下返回一个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的缺点。如果您编写现代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。