为我的C ++类构建日历。我有一个静态方法和静态容器的实用程序类。最值得注意的是:
Dictionary.h
static std::map<int,std::tuple<std::string,int>>months;
static std::map<int,std::tuple<std::string,int>>::iterator mitr;
此地图包含月份0-11作为键。元组值包含每个月的字符串表示形式和每个月的天数。例如:
Dictionary.cpp
map<int,tuple<string,int>> Dictionary::initMonths(){
map<int,tuple<string,int>>m;
map<int,tuple<string,int>>::iterator mapitr = m.begin();
m.insert(mapitr, make_pair(0,make_tuple("January",31)));
m.insert(mapitr, make_pair(1,make_tuple("February",28)));
// insert remaining months...
return m;
}
当我尝试从另一个类访问此映射时出现问题:
Calendar.cpp
Calendar::Calendar(){
Dictionary::init();
time_t t = chrono::system_clock::to_time_t(chrono::system_clock::now());
tm* t2 = localtime(&t);
int mo = (t2->tm_mon);
Dictionary::mitr = Dictionary::months.find(mo);
cout<<(*Dictionary::mitr).first<<endl; // => 0
cout<<get<0>((*Dictionary::mitr).second)<<endl; // nothing
}
我不确定我在这里做错了什么。任何建议,将不胜感激。
编辑:
void Dictionary::init(){
packaged_task<map<int,tuple<string,int>>()>task3(initMonths);
future<map<int,tuple<string,int>>>fu3 = task3.get_future();
guarded_thread t3(std::move(task3));
map<int,tuple<string,int>>months = fu3.get();
}
答案 0 :(得分:1)
你是如何准备地图的?您的Dictonary代码显示了一个函数Dictionary::initMonths()
,它返回一个映射,但您的示例应用程序代码只调用Dictionary::init()
。如果这些函数实际上是相同的并且这只是一个拼写错误,那么您忘记将initMonths的返回值赋给静态months
变量。
正如一个建议,这里有一张地图似乎有点像矫枉过正 - 你实际上并不想要地图的属性,在这种情况下它会在树状结构中排列稀疏键。使用向量或固定数组并且只需通过索引进行访问(不使用迭代器等)可能更容易(也更快,对于它的价值而言)。