![](/img/trans.png)
[英]How should set a char* member of a class? Using strcat or something else?
[英]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风格的编码和不良的设计,因为这会使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.