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

5 浏览
0 Comments

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

我正在阅读Stroustrup的《原则与实践》第10章的一部分内容,他提供了一种创建将月份数字转换为名称及其反向转换的表格的方法。该表格是以字符串向量的形式存在的,然后由程序的头文件中声明的多个函数使用。我试图简化一些,将向量的声明和初始化放在同一个头文件中,以便所有函数都可以看到它:\n

std::vector 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";

\n现在,G++似乎无法理解我试图做什么:\n

temperature.cpp:1: 从文件包含的文件中:
Temperature.h:48:1: 错误:C++要求在所有声明中都指定类型说明符
monthNames[0] = "jan";
^~~~~~~~~~
Temperature.h:49:1: 错误:C++要求在所有声明中都指定类型说明符
monthNames[1] = "feb";
...

\n我理解通常来说,在头文件中声明一个全局向量是不好的做法,但在这个例子中,它似乎是将12个{if...else}替换为转换数字到月份名称及其反向转换的函数中的合理替代方法:\n

const std::string& intToMonth(int num) {
    if ( num < 1 || num > 12 )
        throw BadMonthException();
    return monthNames[num-1];
}

\n所以我有两个问题:\n1) 为什么编译器不允许我初始化向量?\n2) 有没有更好的方法使其工作(不使用全局向量)?

0
0 Comments

问题的原因是,代码中的语句不符合C++语法规则,无法作为声明使用。

解决方法是,考虑使用静态函数变量。静态函数变量是指只在函数作用域内可见,但具有与全局变量相同的生命周期。

具体代码如下所示(适用于早于C++11的cpp标准):

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

0
0 Comments

问题:如何在头文件中初始化一个字符串向量?

原因:在头文件中初始化一个字符串向量可能会导致重定义错误,因为头文件可能会被多次包含。

解决方法:可以使用匿名命名空间和初始化列表来解决这个问题。在匿名命名空间中初始化字符串向量,以避免重定义错误。

具体代码如下:

// 头文件.h
#include 
#include 
namespace {
    std::vector monthNames{ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};
}

通过使用匿名命名空间,可以确保字符串向量只被初始化一次,并且在多次包含头文件时不会导致重定义错误。这是一种常用的解决方法,可以在头文件中初始化静态变量或容器。

0