Статическая STL карта int и кортеж возвращает 0
Создание календаря для моего класса 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();
}
1 ответ
Как именно вы инициируете карту? Ваш код Dictonary показывает функцию Dictionary::initMonths()
, который возвращает карту, но код вашего примера приложения просто вызывает Dictionary::init()
, Если эти функции на самом деле одинаковы и это просто опечатка, то вы забыли присвоить возвращаемое значение initMonths статическому months
переменная.
Так же, как предложение, наличие карты здесь немного похоже на излишнее - вы на самом деле не хотите, чтобы свойство map в этом случае располагало разреженные ключи в древовидной структуре. Возможно, было бы проще (и быстрее, чего бы это ни стоило) просто использовать вектор или фиксированный массив и просто осуществлять доступ по индексу, без итератора и т. Д.