繁体   English   中英

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

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

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。 仅当保证原始对象在使用过程中不消失时,这才有意义。

您可以改为返回布尔值,并通过引用获取AccountHolder,如果匹配则填写。

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

我敢肯定还有其他选择。

我想返回的内容告诉我帐号和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做法。

通过引用将布尔结果作为参数传递
AccountHolder搜索(int accno,字符串CNIC,AccountHolder *客户,int计数器,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM