c++ - 在不让客户端等待程序执行的情况下限制构造函数可以采用的值

标签 c++ oop constructor compiler-errors

假设我们正在为其他程序员开发 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/

相关文章:

c# - 在 C# 层次结构中重写(隐藏、重载?)具有不同返回类型的方法

java - 类测试期间出现 NullPointerException

javascript:关于构造函数**new**关键字的问题

c++ - 在 std::string::end() 和 std::string::capacity() 之间使用缓冲区

c++ - 如何根据 Prop 名称动态设置对象的属性?

c# - 游戏中的对象如何交流

php - OOP接口(interface)点

c# - 有没有办法在构造函数中强制显式参数类型?

c++ - 查找有向图中从根到所有顶点的给定长度的所有路径

c++ - 如何使用 Boost.Python 定义 Python 元类?