当函数返回类数据成员时,我如何返回其他东西
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。只有当原始对象在使用过程中保证不会消失时,这才有意义。
您可以返回一个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
。
- 如何使用单个返回语句返回对变量的引用
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- 在函数返回中返回对新分配的shared_ptr的尊重合法吗
- 为什么要为指针返回类型返回一系列字符?
- 返回不同返回类型的函数的函数指针的函数
- 从弱指针返回类型返回共享指针
- 无法为unique_ptr返回类型返回 nullptr
- 程序的本地执行不会重新返回运输返回.远程执行确实
- QmetaObject :: IndexOfMethod返回到底返回索引
- 这是我的代码,它正在返回Process返回的255(0xff)码块
- 从模板返回的 C++ 返回
- 如何在 JNA 中获取字节数组作为从 C 字节指针返回的返回
- 返回未返回变量值
- 以Integer返回类型返回浮点值
- 如何使用数据类型的一次返回来返回错误
- 适当的函数返回类型返回日期时间
- 查宁在C++返回后返回了指针
- 返回语句返回一个空指针值而不是期望的值
- 为什么从浮点返回方法返回双精度不会在 c++ 中导致任何错误/警告
- 通过引用返回时返回值优化