在头文件中初始化字符串向量

时间:2015-03-13 11:29:39

标签: c++ vector header

我在Stroustrup的“原则与实践”第10章中做了一些工作,他提出创建一个表格,用于将月份数转换为其名称,反之亦然。该表采用字符串向量的形式,然后由程序头文件中声明的几个函数使用。我尝试了一个简单的方法并在同一个头中声明+ init向量,以便所有函数都可以看到它:

std::vector<std::string> monthNames(12);
monthNames[0] = "jan";
monthNames[1] = "feb";
monthNames[2] = "mar";
monthNames[3] = "apr";
monthNames[4] = "may";
monthNames[5] = "jun";
monthNames[6] = "jul";
monthNames[7] = "aug";
monthNames[8] = "sep";
monthNames[9] = "oct";
monthNames[10] = "nov";
monthNames[11] = "dec";

现在G ++似乎并不理解我正在尝试做什么:

In file included from temperature.cpp:1:
./Temperature.h:48:1: error: C++ requires a type specifier for all declarations
monthNames[0] = "jan";
^~~~~~~~~~
./Temperature.h:49:1: error: C++ requires a type specifier for all declarations
monthNames[1] = "feb";

...

我一般都明白,在标题中声明一个全局向量是一种不好的做法,但在这个例子中,它似乎是将nums转换为月份名称的函数中12个{if ... elses}的合理替代反之亦然:

    const std::string& intToMonth(int num) {
    if ( num < 1 || num > 12 )
        throw BadMonthException();

    return monthNames[num-1];
    }

所以我有两个问题:

1)为什么编译器不允许我初始化向量?

2)是否有一种更性感的方式使它全部工作(没有全局载体)?

2 个答案:

答案 0 :(得分:1)

提供包含文件不会被包含多次,您可以使用匿名namespace和初始化列表,例如:

 namespace {
    std::vector<std::string> monthNames{ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
}

答案 1 :(得分:1)

你可以试试这样的东西(适用于比c ++ 11更早的cpp标准):

const std::string _monthNames[] = { "jan", "feb", ... };
std::vector<std::string> monthNames(_monthNames,
                                    _monthNames+sizeof(_monthNames)/sizeof(std::string));

关于你的问题:

  1. 根据C ++语法规则,语句不能用作声明。
  2. 考虑使用静态函数变量 - 仅在函数范围内可见但与全局变量具有相同生命周期的变量。