3

我正在编写一个日期类,我想要一个静态地图将“Jan”映射到 1 等等。我想知道如何初始化该静态地图。这就是我目前正在做的事情,但我只是觉得与 Java 中的静态块相比,额外的 if 语句不优雅。我知道 C++ 程序的编译要复杂得多,但我仍然想知道是否存在更好的解决方案。

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.
4

3 回答 3

6

在 C++11 中,您可以使用初始化列表:

map<string, int> date::month_map = { {"Jan", 1},
                                     {"Feb", 2}
                                     // and so on
                                   };

在 C++03 中,我相信你会坚持你目前正在做的事情。

于 2013-05-06T22:14:51.540 回答
1

对于非 c++11 系统:如何使用辅助函数并创建month_map一个静态 const成员,date因为看起来您永远不想更改月份名称与其编号的关联,是吗?这种方式month_map是在您的 cpp 文件中初始化的,而不是在您的构造函数中,它只会把事情搞砸。(也许你将来会有几个构造函数,那么你将不得不写很多样板代码)

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());
于 2013-11-16T19:16:02.580 回答
0

您可以在 C++ 中“实现”静态块功能,甚至是 C++11 之前的版本。在这里查看我的详细答案;它会让你做的简单

#include "static_block.hpp"

static_block {
    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;
}   

但是,使用初始化列表好得多,因此如果您有 C++11 编译器,请使用 @syam 的回答建议的那些。

于 2016-09-02T18:06:33.250 回答