2016-10-12 57 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並且將定義一個來源。