当函数返回类数据成员时,我如何返回其他东西

How I return something else when a function returns class data member?

本文关键字:返回 何返回 其他 函数 数据成员      更新时间:2023-10-16
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不匹配。我可以通过创建一个新对象来做到这一点,因为我的构造函数将所有数据成员设置为零或空字符串,我可能能够检查这样的客户不存在,但还有其他方法吗?这是我的第一个问题,所以我希望我没有问一个愚蠢的问题。谢谢!

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

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

可以返回指向对象的const指针,在出现错误时返回NULL。只有当原始对象在使用过程中保证不会消失时,这才有意义。

您可以返回一个bool值,并通过引用获取您的accounholder,如果有匹配,则填充它。

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

我想返回一些东西,告诉我账号和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风格的编码和糟糕的设计,因为它使你的Search()函数原型复杂化和/或增加更多的内存管理比必要的。这里使用的是c++,所以尽量保持简单并使用良好的OOP实践。

通过引用传递布尔值结果作为参数
查询帐户持有人(int accno, string CNIC, accounholder * customer, int counter, bool &isMatch)
{
///
}

将返回类型转换为指针,或者更好地转换为智能指针,并返回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。

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

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

如果您手边有boost,那么值得考虑的是boost::optional<>。这很好,因为它还准确地记录了返回的内容。如果没有任何有用的东西可以返回,则可以返回boost::none