2017-04-03 1 views
0

私のC++クラス用のカレンダーを作成します。私は静的メソッドと静的コンテナのユーティリティクラスを持っています。最も顕著なのは:intとtupleの静的STLマップは0を返します

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として、含まれています。タプル値には、各月の文字列表現と各月の日数が含まれます。

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 
    } 

私はよく分からない:例えば:私は別のクラスからこのマップにアクセスしようとすると

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; 
} 

問題が発生します私がここで間違っていること。任意の提案をいただければ幸いです。

EDIT:

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変数に代入するのを忘れてしまいました。

ちょっとした提案として、ここで地図を持っているのはちょっと残酷な感じです。実際に地図のプロパティを望んでいないのは、このような木のような構造の疎なキーを配置したということです。ベクトルや固定配列を使用し、イテレータなどを使わずにインデックスだけでアクセスする方が簡単です(もっと速くなります)

+0

ここでマップを使用する主な理由は、月の文字列名とその月の日数をまとめて1つのコンテナに格納します。 –

+0

これはベクトルでも可能です(さらに簡単な場合もあります): 'std :: vector > months(12); months [0] = make_tuple( "January"、31); // ... ' – volzo

+0

... btw、あなたの元の問題は修正されましたか? – volzo

関連する問題