月份表示:枚举类与班级

时间:2016-10-12 17:26:24

标签: c++ class enums

我对C ++很陌生,目前正在通过Stroustrup的编程:原则&练习使用C ++。我读了大约2/3的书,但由于暂时无法访问PC,我只是陷入了练习。我目前正在进行第9章中的练习,其中要求读者创建Date类。

我的简单Date类最初包含一个枚举类Month,其中三个字母缩写代表每个月,因此代码我可以编写如下内容:

Month::jan
例如,

比写整数1更具描述性。据我所知,这是使用枚举类的主要目的/优势。

现在,我正在扩展Date类来执行诸如计算给定日期的天数或给定日期的周数之类的事情,我发现自己想要替换枚举class Month,包含每月保存信息的类或结构(例如名称,缩写名称,月份编号和月份中的天数)和容器(矢量实际上是我在这一点上唯一适合使用的容器)包含12个月。这也允许我编写成员函数,从组织的角度来看,这些函数在Month类的范围内比Date类更好。

但是,如果我更改为此表示形式,则会在代码中引用月份时失去枚举类提供的便利,而是必须编写如下内容:

Month.Months(1) // where Months is the Month class member vector<Month>

所以我的问题是,有没有一种方法可以设计我的课程,让我两全其美?谢谢!

1 个答案:

答案 0 :(得分:0)

Fwiw,我就是这样做的:

https://github.com/HowardHinnant/date/blob/master/date.h#L1671-L1682

CONSTDATA只是constexpr的向后兼容性宏。如果链接失效:

constexpr date::month jan{1};
constexpr date::month feb{2};
constexpr date::month mar{3};
constexpr date::month apr{4};
constexpr date::month may{5};
constexpr date::month jun{6};
constexpr date::month jul{7};
constexpr date::month aug{8};
constexpr date::month sep{9};
constexpr date::month oct{10};
constexpr date::month nov{11};
constexpr date::month dec{12};

如果您的工具箱中没有constexpr(需要C ++ 11),则可以使用extern const并将定义放在源代码中。