Month的表示:enum class与class

Representation of Month: enum class vs. class

本文关键字:class enum 表示 Month      更新时间:2023-10-16

我对c++相当陌生,目前正在通过Stroustrup的编程:原理&练习使用c++。我已经读了这本书的三分之二,但由于有一段时间没有电脑,我只是在练习中赶上了。我目前正在做第9章中的练习,其中要求读者创建一个Date类。

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

Month::jan
例如,

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

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

但是,如果我改用这种表示,就会失去枚举类在代码中引用月份时提供的便利,而不得不这样写:
Month.Months(1) // where Months is the Month class member vector<Month>

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

我是这样做的:

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并将其定义放在源代码中。