2017-04-03 11 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; 
} 

문제가 발생합니다 내가 여기서 잘못하고있는 것. 모든 제안을 부탁드립니다.

편집 :

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

여기에서지도를 사용하는 주된 이유는 월 번호 인덱스를 바인딩하는 것이기 때문에, 달의 문자열 이름과 달의 일 수를 모두 하나의 컨테이너에 함께 표시합니다. –

+0

벡터로 여전히 가능할 것입니다 (그리고 더 쉬울 수도 있습니다) : 'std :: vector > months (12); 개월 [0] = make_tuple ("January", 31); // ...' – volzo

+0

... btw, 원래 문제가 해결 되었습니까? – volzo