关于c ++:在头文件中初始化一个字符串向量

Initialize a string vector in header file

本问题已经有最佳答案,请猛点这里访问。

我是从斯特劳斯鲁的"原则与实践"第10章开始的,他提出创建一个表格,将月份数转换成他们的名字,反之亦然。该表是一个字符串向量的形式,然后由程序头文件中声明的几个函数使用。我尝试了一种简单的方法,在同一个头中声明+in it向量,以便所有函数都能看到它:

1
2
3
4
5
6
7
8
9
10
11
12
13
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++似乎不明白我要做什么:

1
2
3
4
5
6
7
8
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";

...

我一般理解,在头中声明全局向量是一种糟糕的实践,但在本例中,它似乎是将num转换为月份名称的函数中12 if…elses的合理替代,反之亦然:

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

    return monthNames[num-1];
    }

所以我有两个问题:

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

2)有没有一种更性感的方法可以让一切正常工作(没有全局向量)?


您可以尝试这样的(为CPP标准比C++ 11工作):

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

关于你的问题:

  • 这些语句不能用作C++语法规则的声明。
  • 考虑使用静态函数变量——仅在函数范围内可见,但与全局变量的生存期相同的变量。

  • 如果include文件不包含多次,则可以使用匿名namespace和初始化列表,如下所示:

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