C++ 初始化头文件中的字符串向量

C++ 初始化头文件中的字符串向量,c++,vector,header,C++,Vector,Header,我在做Stroustrup的“原则和实践”第10章中的一些内容,他提供创建一个表,用于将月份数转换为月份名称,反之亦然。该表是字符串向量的形式,然后由程序头文件中声明的几个函数使用。我尝试了一种简单的方法,在同一个头中声明+init向量,以便所有函数都能看到它: std::vector<std::string> monthNames(12); monthNames[0] = "jan"; monthNames[1] = "feb"; monthNames[2] = "mar"; mo

我在做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";
我一般理解,在头中声明全局向量是一种糟糕的做法,但在本例中,它似乎是将NUM转换为月份名称的函数中的12{if…elses}的合理替代品,反之亦然:

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

    return monthNames[num-1];
    }
const std::string和intToMonth(intnum){
如果(num<1 | | num>12)
抛出BadMonthException();
返回月份名称[num-1];
}
所以我有两个问题:

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


2) 是否有一种更性感的方法可以让它全部工作(没有全局向量)?

如果包含文件不包含多次,您可以使用匿名
命名空间和初始化列表,例如:

 namespace {
    std::vector<std::string> monthNames{ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
}
名称空间{
病媒月{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
}

您可以尝试类似的方法(适用于早于c++11的cpp标准):

const std::string _monthNames[]={“一月”、“二月”、“二月”…};
标准::向量月,
_monthNames+sizeof(_monthNames)/sizeof(std::string));
关于你的问题:

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

  • 我假设您
    #include
    #include
    ?请提供一个。另外,您使用的编译器和标准库版本是什么?@Blacktempel:2015。每一个C++问题至少默认是一个C++ 11题。“我一般理解,在一个报头中声明一个全局向量是一个很差的实践”问题不是矢量是全局的,而是试图在全局范围内运行代码(12个赋值到向量中),并且在全局范围内只允许声明和定义。not语句。@Blacktempel有一个refuseniks标签。
     namespace {
        std::vector<std::string> monthNames{ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
    }
    
    const std::string _monthNames[] = { "jan", "feb", ... };
    std::vector<std::string> monthNames(_monthNames,
                                        _monthNames+sizeof(_monthNames)/sizeof(std::string));