当函数返回类数据成员时,我如何返回其他内容?

时间:2014-03-10 12:55:23

标签: c++ return-type

AccountHolder Search(int accno, string CNIC, AccountHolder* customer, int counter) {
for (int i = 0;i < counter;i++) {
    if (account == customer[i].getAccno() && CNIC == customer[i].getCNIC()) {
        return customer[i];
    }
}
return (-----);
}

问题是我想要返回一些东西,告诉我帐号和CNIC与任何客户ID都不匹配。我可以通过创建一个新对象来完成它,并且当我的构造函数将所有数据成员设置为零或空字符串时,我可以检查这样的客户是否存在但是还有其他方法吗? 这是我的第一个问题,所以我希望我没有问过一个愚蠢的问题。 谢谢!

6 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,有些方法比其他方式更好,但这取决于你的情况。

如果它不经常发生并且是实际错误(这是关键,因为它很慢),抛出异常。

您可以返回一个指向对象的const指针,并在发生错误时返回NULL。只有保证原始对象在使用过程中不会消失,才有意义。

您可以改为返回一个bool,并通过引用获取您的AccountHolder,如果匹配则将其填入。

您也可以通过引用获取布尔值,我不太喜欢这个选项,因为它是一个非常奇怪的接口选择。

我确定还有其他选择。

答案 1 :(得分:1)

  

我想要回复一些告诉我帐号和CNIC与任何客户ID不匹配的内容

有两种方法可以考虑这个问题:

  • 使用例外

如果你的Search()总是有有效的参数(即现有的帐号和CNIC),并且从来没有错误的值,那么当它有一个错误的参数集时,它会因为抛出异常而大声失败:

AccountHolder Search(int accno, string CNIC, AccountHolder* customer, int counter) {
    for (int i = 0;i < counter;i++) {
        if (account == customer[i].getAccno() && CNIC == customer[i].getCNIC()) {
            return customer[i];
        }
    }
    throw std::invalid_argument("Unknown account");
}

当然,自定义设计的例外更好。

  • 使用单身人士

但如果这种情况是您的设计的一部分并且这不是错误,而是一个功能,那么它将返回一个您可以测试的值,告诉您该客户不存在:

因此,您应该使用可以检查的自定义字段设计AccountHolder类,以便创建从此函数返回的全局unknownAccountHolder实例,然后进行检查。因为您没有提供AccountHolder设计。

class AccountHolder {
    static const AccountHolder unknownAccountHolder(-1, "invalid");
    […]
}

AccountHolder Search(int accno, string CNIC, AccountHolder* customer, int counter) {
    for (int i = 0;i < counter;i++) {
        if (account == customer[i].getAccno() && CNIC == customer[i].getCNIC()) {
            return customer[i];
        }
    }
    return AccountHolder::unknownAccountHolder;
}
  • 使用C样式错误处理是错误的第三个选项

您可以使用建议的其他选项:使用返回的指针,传递布尔值作为参数,返回布尔值并将对象作为参数...但这是所有c风格的编码和糟糕的设计,因为它使您的{{1函数原型和/或添加超出必要的内存管理。你在这里做C ++,所以尽量保持简单,并使用良好的OOP练习。

答案 2 :(得分:0)

通过引用传递布尔结果作为参数
    AccountHolder搜索(int accno,字符串CNIC,AccountHolder * customer,int counter,bool&amp; isMatch)
    {
    ///
    }

答案 3 :(得分:0)

将返回类型转换为指针,甚至更好的智能指针,并返回NULL或等效的智能指针:

AccountHolder * Search(int accno, string CNIC, AccountHolder* customer, int counter) {
  for (int i = 0;i < counter;i++) {
    if (account == customer[i].getAccno() && CNIC == customer[i].getCNIC()) {
      return &customer[i];
    }
  }
  return NULL;
}

为了使用智能指针,您必须更改客户的定义方式,例如将其设为std::vector<std::shared_ptr<AccountHolder> >。如果您的编译器未提供std::shared_ptr,则需要使用Boost

答案 4 :(得分:0)

一种选择是返回bool以指示搜索是否成功。在这种情况下,您需要一个额外的输出参数,如果函数返回true,它将存储结果。

bool Search(int accno, string CNIC, AccountHolder* customer, int counter, AccountHolder *result);

答案 5 :(得分:0)

如果你有方便的话,值得考虑的是boost::optional<>。这很好,因为它也准确地记录了返回的内容。如果您没有任何有用的东西可以返回,您可以返回boost::none