可以/不能返回结构的C++方法

Luc*_*ky5 8 c++ struct

我有一个C++结构和一个方法:

struct Account
{
    unsigned int id;
    string username;
    ...
};


Account GetAccountById(unsigned int id) const { }
Run Code Online (Sandbox Code Playgroud)

如果帐户存在,我可以返回帐户结构,但如果没有帐户该怎么办?

我想过:

  • 结构上的"有效"标志(因此可以返回空标志,并将其设置为false)
  • 如果输出有效,则设置另一个"有效"指针(const string&id,int*is_ok)
  • 返回一个帐户*,并返回指向结构的指针,如果它不存在则返回NULL?

有没有最好的方法呢?

unw*_*ind 13

在C++中你忘记了最明显的一个:

bool GetAccountById(unsigned int id, Account& account);
Run Code Online (Sandbox Code Playgroud)

true如果帐户存在,则返回并填写提供的参考,否则返回false.

使用指针可以为null并具有以下事实也可能是方便的:

bool GetAccountById(unsigned int id, Account* account);
Run Code Online (Sandbox Code Playgroud)

true如果帐户ID存在,则可以定义为返回,但如果指针非空,则仅(当然)填写提供的帐户.有时能够测试存在是否方便,这样可以节省必须专门用于此目的的方法.

这是你喜欢的味道问题.

  • 我更喜欢Juraj的答案,因为它编码了类型中的可空性,这增加了代码的类型安全性.特别是,使用你的方法可能会意外忘记检查返回,而如果返回值是值,那么你必须让它使用它:) (3认同)
  • 我认为我的主要问题是命名功能.对我来说,GetX()应该总是返回X(如果没有那就是异常).如果X可能存在,那么应该有findX()函数返回迭代器(或像对象一样的迭代器).如果找不到该对象,则可以从迭代器确定是否可以将迭代器转换为对象的引用.传递输出参数非常直观,并且要求您能够创建无效/空对象(要传入和填充).无效/空对象容易出错. (2认同)

Jur*_*aho 7

根据给出的选项,我会回来Account*.但返回指针可能会对接口产生一些不良副作用.

另一种可能性是在throw没有此类帐户时例外.你也可以试试boost::optional.


Goz*_*Goz 6

您还可以尝试空对象模式.