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)); |
关于你的问题:
如果include文件不包含多次,则可以使用匿名
1 2 3 | namespace { std::vector<std::string> monthNames{"jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"}; } |