1

给定以下简单的函数声明:

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

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

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

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

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

老实说,我两个都讨厌。希望从更有经验的 c++ 程序员那里听到一些更好的解决方案。

编辑:

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

4

3 回答 3

1

选项很少:

  1. 返回表示错误的正常返回类型的特殊值。
  2. 更改返回到错误代码(或标志)并具有输出参数(引用或指针)。
  3. 返回一个同时具有值​​和错误指示符的包装器(例如Boost.Optional)。
  4. 抛出异常。
  5. 有不能无效的论据。

选项 1 到 4 非常明显。

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

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

一个。将月份和年份的类型更改为无符号。
湾。将“月”解释为连续的:

vector<Date> getMonthArray(unsigned int month, unsigned int year) {
   year = year + month / 12;
   month = month % 12;
   ...
于 2013-11-02T18:55:28.217 回答
0

如果它可能失败,那么空向量并不是一个糟糕的主意。人们似乎喜欢返回错误代码的一种技巧是将向量作为参考参数,并将函数的返回值更改为布尔值,如果有更多类型的返回代码(可以是枚举类型,也)。根据返回的值,您的向量可能存在不同的条件。我认为在这种情况下,尽管空向量很好,只要它记录得当。

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

//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);
于 2013-11-02T18:34:16.347 回答
0

很简单,传递向量并返回 abool表示成功。

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

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

于 2013-11-02T18:36:10.757 回答