2016-10-12 19 views
0

我对C++相当陌生,目前正在使用Stroustrup的Programming:Principles &练习使用C++。我已经阅读了大约2/3的书,但由于一段时间没有使用电脑,我只是被赶上练习。我目前正在研究第9章中的练习,读者被要求创建一个Date类。本月的呈现:枚举类与类

我简单的日期类本来就包含枚举类月份的三个字母缩写代表每个月,这样的代码,我可以写的东西,如:

Month::jan 

这比写整数1得多描述, 例如。据我所知,这是使用枚举类的主要目的/优势。

现在我正在扩展Date类来完成诸如计算给定日期的天数或给定日期的星期数等事情,我发现自己想要替换枚举类Month,使用一个类或结构体来保存每个月的信息(例如,名称,缩写名称,月份编号和月份中的日期)以及包含12个月的容器(载体实际上是我现在使用的唯一一个) 。这也使我能够编写成员函数,从组织的角度来看,在Month类的范围内比Date类更好。

如果我改变这个表示,不过,我失去了枚举类的代码中提及个月时所提供的方便,而是必须写类似:

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

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

+0

所以你想写自己的['struct tm'](http://en.cppreference.com/w/cpp/chrono/c/tm)是因为什么原因?我不确定你的目标是什么。 – tadman

+0

是的,我很难弄清楚你的目标是什么,第一部分好像你想隐式地从'int'转换成'Month',我不确定你在那之后会得到什么。 –

+0

为什么不是两个?制作一个'enum class Month'和类'MonthInfo'类似的东西,这样你就可以编写'Month :: jan'而不是'1'和'MonthInfo(Month :: jan)'来创建一个代表1月份所有月份的对象相关的成员函数。你在寻找这样的建议吗? –

回答

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并且将定义一个来源。