按值返回 - 错误指示值

时间:2013-11-02 18:30:35

标签: c++

给出以下简单函数声明:

vector<Date> getMonthArray(int month, int year);

对于C ++ 11,我可以利用MOVE语义并按值返回Date向量而不会丢失任何性能,并避免使用“new”和“delete”。

问题是如果函数失败,我不知道该返回什么.. 例如。月份或年份低于零

我不能像指针那样返回null, 所以我想到了两种可能性:

1)返回一个空数组 2)抛出异常

说实话,我讨厌两者。我很乐意听到更有经验的c ++程序员提供更好的解决方案。

编辑:

因此,抛出异常看起来确实是最优雅的解决方案,因为它不涉及用户为了正确运行函数而需要读取的任何文档(除了可抛出的异常)。我对么?还是其他更多选择?

3 个答案:

答案 0 :(得分:1)

选项很少:

  1. 返回指示错误的正常返回类型的特殊值。
  2. 更改返回错误代码(或标志)并具有输出参数(引用或指针)。
  3. 返回一个包含值和错误指示符的包装器(例如Boost.Optional)。
  4. 抛出异常。
  5. 拥有无效的参数。
  6. 选项1到4非常明显。

    选项5并非总是可行,但在某些情况下,仔细选择参数类型(包括枚举)和解释可能会有效。

    不知道你的功能是什么,这里有一些建议:

    一个。改变月份的类型和未签约的一年 湾将'月'解释为连续:

    vector<Date> getMonthArray(unsigned int month, unsigned int year) {
       year = year + month / 12;
       month = month % 12;
       ...
    

答案 1 :(得分:0)

如果它可能失败,空矢量并不是一个糟糕的主意。人们似乎喜欢返回错误代码的一个方法是将向量作为引用参数,并将函数的返回值更改为布尔值,如果有更多类型的返回码,则更改为int(可以是枚举类型,太)。根据返回的值,矢量可能会有不同的条件。我认为在这种情况下,虽然空载体很好,只要它记录得很好。

参考参数示例,布尔返回方法

//pre: none
//post: if month and year are valid, monthArray will contain array 
//      of months and function returns true.
//      Otherwise returns false with no guarantees on contents of monthArray
bool getMonthArray(int month, int year, vector<Date>& monthArray);

错误代码示例,参考参数

//pre: none
//post: if month and year are valid, monthArray will contain array 
//      of months and function returns 0 for success.
//      If month is valid but year is not, returns -1
//      If month is invalid, but year is not, returns -2
//      If month and year are valid, but otherwise failed, returns -3
int getMonthArray(int month, int year, vector<Date>& monthArray);

答案 2 :(得分:0)

简单,传递向量并返回bool以获得成功。

bool getMonthArray(std::vector<Date>* out, int month, int year);

在您的实现中,如果参数无效,则返回false。