给出以下简单函数声明:
vector<Date> getMonthArray(int month, int year);
对于C ++ 11,我可以利用MOVE语义并按值返回Date向量而不会丢失任何性能,并避免使用“new”和“delete”。
问题是如果函数失败,我不知道该返回什么.. 例如。月份或年份低于零
我不能像指针那样返回null, 所以我想到了两种可能性:
1)返回一个空数组 2)抛出异常
说实话,我讨厌两者。我很乐意听到更有经验的c ++程序员提供更好的解决方案。
编辑:
因此,抛出异常看起来确实是最优雅的解决方案,因为它不涉及用户为了正确运行函数而需要读取的任何文档(除了可抛出的异常)。我对么?还是其他更多选择?
答案 0 :(得分:1)
选项很少:
选项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。