函数返回0作为参考

时间:2010-06-17 09:49:48

标签: c++

I have this snippet of the code

Account& Company::findAccount(int id){
        for(list<Account>::const_iterator i = listOfAccounts.begin(); i != listOfAccounts.end(); ++i){
            if(i->nID == id){
                return *i;
            }
        }
        return 0;
    }

如果我找不到合适的帐户,这是否正确返回0? 因为我收到错误:

no match for 'operator!' in '!((Company*)this)->Company::findAccount(id)'

我这样使用它:

if(!(findAccount(id))){
            throw "hey";
          }

提前致谢

5 个答案:

答案 0 :(得分:4)

没有空引用这样的东西。标准说:

  

应初始化引用以引用有效的对象或函数。 [注意:特别是,在一个定义良好的程序中一个空引用不能存在,因为创建这样一个引用的唯一方法是将它绑定到通过解除引用空指针获得的“对象” ,这会导致未定义的行为。

答案 1 :(得分:2)

你不能在C ++中返回“null引用”,因为在这种语言中没有这样的概念。

如果结果是Account或者不是Account,那么一种方法是返回Account *

答案 2 :(得分:1)

不,这是不可能的。看起来函数可能已从更改指针(Account *)返回到返回引用(Account&amp;)。

您不能返回0 / null作为参考,您将不得不更改函数的设计。也许还原为Account *作为返回类型。

如果在if语句中使用它,则可以将其更改为返回std :: bool。但目前的签名表明了其他使用模式。

答案 3 :(得分:1)

另一种方式(除了Account *)将返回特殊的Account :: empty对象,和/或使用account.IsEmpty()进行测试。

答案 4 :(得分:1)

为什么不使用标准算法,如std :: find_if。

编辑:find_if的解释。

这是find_if算法的参考。 http://cplusplus.com/reference/algorithm/find_if/

bool isEqual(int id1, int id2) {
   return id1 == id2;
}

void foo() {
    std::list<Account> accountList;
    // Fill this list here.

    list<Account>::iterator it = std::find_if(accountList.begin(), accountList.end(), bind(isEqual, idYouSearch, _1));

    Account ac = *it;
}

您可能需要bind和_1占位符的其他包含。对于isEqual,可以使用std谓词,你可以使用它。