假设我们正在为其他程序员开发 API。我们的 API 有一个 Date 对象供他们使用,我们希望将月、日和年的值限制为有效值,例如 1-12 表示月,1-31 表示日,1900- 2014 年。为此,我们创建了单独的 Month、Day 和 Year 对象,所有这些对象都传递给 Date 的构造函数,我们这样调用它:
Date date(Month::Jan(), Day(1), Year(1980));
为了保证Month只能是1-12,我们可以为每个月份创建单独的函数,每个函数返回一个对应那个月份的月份对象,保证没有人可以创建错误的月份值,我们将 Month 的构造函数设为私有(private):
class Month {
public:
static Month Jan () { return Month(1);}
static Month Feb () { return Month(2);}
static Month Mar () { return Month(3);}
static Month Apr () { return Month(4);}
static Month May () { return Month(5);}
static Month Jun () { return Month(6);}
static Month Jul () { return Month(7);}
static Month Aug () { return Month(8);}
static Month Sep () { return Month(9);}
static Month Oct () { return Month(10);}
static Month Nov () { return Month(11);}
static Month Dec () { return Month(12);}
private:
Month (int n) : monthNum (n) {}
int monthNum;
};
但是,对于 Day 和 Year,我们不能使用仅包含数字的函数名称,例如 Year::1997()
我们希望这种格式对客户端开发人员来说是直观的,因此语法如下Year::year1997()
已经出来了。另外,我们不想为每个可能的年份手动编写函数代码。假设年份回溯到足够远以至于这将是一个问题,例如回到 1900 年。因此,我们将坚持使用 Day(1)
或 Year(1997)
格式。
鉴于此,有什么好的方法可以确保构造的 Day 和 Year 只能返回我们想要的值范围?一种方法是在输入无效值时抛出异常:
class Day {
public:
Day (int d) : dayNum(d) {
if(d <= 0 || d >= 31) {
throw "Invalid day";
}
}
private:
int dayNum;
};
但这会在运行时产生错误,而不是在编译时产生错误,我们正在构建它供开发人员使用,因此我们希望他们在做错事情时尽快知道,例如将无效的日或年(例如第 32 天或第 3000 年)。什么是确保客户只能创建具有有效值的 Day 或 Year 对象而无需等到程序执行才通知他们的有效方法?
最佳答案
模板可能是一个选项。查看this
关于c++ - 在不让客户端等待程序执行的情况下限制构造函数可以采用的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23383581/