全局范围的对象不是递归初始化的
Global scoped objects are not initialized recursively?
我的项目中有以下代码:
主窗口.cpp
#include "date.h"
Date date; //extern from date.h <- Error when instantinating this one
MainWindow::MainWindow(){//...}
date.cpp
#include "date.h"
#include "consants.h"
//..Stuff
Date::Date()
{
//Use const int variable from "constants.h"
year = constants::START_YEAR; //Works, START_YEAR is initialized
Month month(m, y);
}
Month::Month(int month, int year)
{
//Use const std::map<QString, std::pair<int,int>> from "constants.h"
day_count = constants::MONTH_DAY_MAP_LY.at("January").second //ERROR, MONTH_DAY_MAP_LY is not initialized
}
常数.h
namespace constants {
const int START_YEAR = 2016;
const int YEAR_COUNT = 83;
const QList<QString> MONTH { "January", "February", "March",
"April", "May", "June", "July", "August", "September", "October", "November", "December"};
const std::map<QString, std::pair<int, int>> MONTH_DAY_MAP{
{MONTH[0], std::make_pair(0, 31)}, {MONTH[1], std::make_pair(1, 28)}, {MONTH[2], std::make_pair(2, 31)},
{MONTH[3], std::make_pair(3, 30)}, {MONTH[4], std::make_pair(4, 31)}, {MONTH[5], std::make_pair(5, 30)},
{MONTH[6], std::make_pair(6, 31)}, {MONTH[7], std::make_pair(7, 31)}, {MONTH[8], std::make_pair(8, 30)},
{MONTH[9], std::make_pair(9, 31)}, {MONTH[10], std::make_pair(10, 30)}, {MONTH[11], std::make_pair(11, 31)}
};
const std::map<QString, std::pair<int, int>> MONTH_DAY_MAP_LY {
{MONTH[0], std::make_pair(0, 31)}, {MONTH[1], std::make_pair(1, 29)}, {MONTH[2], std::make_pair(2, 31)},
{MONTH[3], std::make_pair(3, 30)}, {MONTH[4], std::make_pair(4, 31)}, {MONTH[5], std::make_pair(5, 30)},
{MONTH[6], std::make_pair(6, 31)}, {MONTH[7], std::make_pair(7, 31)}, {MONTH[8], std::make_pair(8, 30)},
{MONTH[9], std::make_pair(9, 31)}, {MONTH[10], std::make_pair(10, 30)}, {MONTH[11], std::make_pair(11, 31)}
};
}
如您所见,我在尝试访问MONTH_DAY_MAP_LY
时遇到std::out_of_range
错误。在调试会话之后,我发现发生这种情况是因为Date
的构造函数在任何其他函数(甚至是main)之前都被调用。但我也在标准中找到了这个页面:
实现定义了命名空间范围的对象的动态初始化(8.5、9.4、12.1、12.6.1)是否在main的第一个语句之前完成。如果初始化被推迟到main的第一个语句之后的某个时间点,则应在首次使用与要初始化的对象在同一转换单元中定义的任何函数或对象之前进行。
由于这个规则适用于Date date
和constants.h
中的对象,我不知道为什么链接器初始化Date date
,而只初始化constants.h
中的int
。
MONTH_DAY_MAP_LY
是std::map<QString, std::pair<int, int>>
,所以应该使用std::map::at
和QString
作为参数,而不是元素索引:constants::MONTH_DAY_MAP_LY.at("January").second
。
来自文件:
T& at( const Key& key );
(1)(自C++11起)
const T & at( const Key& key ) const;
(2)(从C++11开始)返回对具有与键等效的键的元素的映射值的引用。如果不存在这样的元素,则抛出类型为
std::out_of_range
的异常。
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- C++类 - 初始化列表 - 递归 - 按值传递
- 使用元编程递归初始化 std::array
- 使用迭代器对向量的C 递归初始化产生不一致的结果
- 具有类型名的模板的递归实例化
- 尝试使用 OpenMP 并行化递归函数的冗余计算
- 是否有可能摆脱模板专用化以停止递归
- 无递归的初始化
- 如何初始化递归函数的长度
- 模拟递归定义的类似数组类的聚合初始化
- 如果结构作为递归函数中的参数传递,如何初始化结构的成员变量
- 递归下降解析器,变量与自身的初始化,困境
- 递归序列化导致vc10/11中出现堆栈溢出错误,但vc9中没有
- c++ /Java递归变量初始化
- 在c++中使用递归时,如何避免重新初始化变量?
- 初始化模板化的、递归的、POD结构
- 内部模板类的递归专用化结束
- 全局范围的对象不是递归初始化的
- 在递归函数中通过引用传递的数组 - 最后一列重新初始化