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都不匹配。我可以通过创建一个新对象来完成它,并且当我的构造函数将所有数据成员设置为零或空字符串时,我可以检查这样的客户是否存在但是还有其他方法吗? 这是我的第一个问题,所以我希望我没有问过一个愚蠢的问题。 谢谢!
答案 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风格的编码和糟糕的设计,因为它使您的{{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
。