I am writing a date class where I want a static map to map "Jan" to 1 and so on. I am wondering how I can initialize that static map. This is what I am currently doing, but I just feel that the extra if statement is inelegant compared with static block in Java. I understand the compilation of C++ program is much more complicated, but I still wonder whether a better solution exists.
class date {
static map<string, int> month_map;
int month;
int year;
public:
class input_format_exception {};
date(const string&);
bool operator< (const date&) const;
string tostring() const;
};
map<string, int> date::month_map = map<string,int>();
date::date(const string& s) {
static bool first = true;
if (first) {
first = false;
month_map["Jan"] = 1;
month_map["Feb"] = 2;
month_map["Mar"] = 3;
month_map["Apr"] = 4;
month_map["May"] = 5;
month_map["Jun"] = 6;
month_map["Jul"] = 7;
month_map["Aug"] = 8;
month_map["Sep"] = 9;
month_map["Oct"] = 10;
month_map["Nov"] = 11;
month_map["Dec"] = 12;
}
// the rest code.
}
// the rest code.
In C++11 you can use initializer lists:
map<string, int> date::month_map = { {"Jan", 1},
{"Feb", 2}
// and so on
};
In C++03 I believe you're stuck with what you are currently doing.
For non-c++11 systems: how about using a helper function and make month_map a static const member of date as it looks like you never wan't to change the association of the month's name with it's number, do you? This way month_map is initialized in your cpp-File and not in your constructor where it just messes things up. (Maybe you'll have several constructors in the future then you'll have to write a lot of boilerplate code)
const std::map<string, int> createMonthMap()
{
std::map<string, int> result;
// do init stuff
return result;
}
const std::map<string, int> date::month_map(createMonthMap());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With