2015-02-01 1 views
0

일반 데이터 형식을 저장하는지도 클래스 템플릿이 있습니다. 지도 클래스의 색인 생성을 위해 문자열을 사용해야합니다. 초기화되지 않은 요소에 액세스하려는 경우 초기화되지 않은 예외를 throw해야합니다. 메인은 다음과 같습니다사용되지 않는 변수가있는 C++ 예외

mapClass <double> mc; 

mc[”aaa”] = 3.5; 

double var1 = mc[“aaa”]; 

cout << var1 << endl; //print 3.5 

try{ 

    double var2 = mc[“aab”]; //uninitialized error: throw exception 

}catch(classMap<double>::Uninitialized&){ 

    cout<< ”Uninitialized error…..”<<endl; 

} 

내 생각은 키 (문자열)를 저장합니다 mapClass 템플릿 및 가치 (T) 요소의 내부 노드 클래스를 만드는 것입니다. T 요소에 대한 참조를 반환하는 연산자 [] 오버로드를 구현했습니다. 이 연산자 [] overload는 지정된 문자열이 벡터 안에 존재하지 않으면 새로운 요소를 push_back합니다.

template< typename T > 

class mapClass{ 

public: 

    class Uninitialized{}; 

    class Node{ 
    public: 
     string key; 
     T value; 
     bool asigned; 

     Node(){ 
      key = ""; 
      asigned = false; 
      } 
     ~Node(){} 
    }; 

    mapClass(){ 
     initialized=false; 
     max=0; 
    } 

    T& operator[](string a){ 
     int ret; 
     bool out = false; 
     if (!initialized){ 
      Node newNode; 
      nodeArray.push_back(newNode); 
      nodeArray[0].key = a; 
      initialized = true; 
      max = 0; 
      ret = 0; 
     } 
     else{ 
      for (int i = 0; i <= max; i++){ 
       if (nodeArray[i].key == a){ 
        out = true; 
        ret = i; 
       } 
      } 
      if (!out){ 
       max++; 
       ret = max; 
       Node newNode; 
       nodeArray.push_back(newNode); 
       nodeArray[max].key = a; 
      } 
     } 
     return nodeArray[ret].value; 
    } 

private: 

    vector<Node> nodeArray; 
    bool initialized; 
    int max; 
}; 

지금 프로그램은 값 3.5를 출력뿐만 아니라, (주위 -8578623 이동) 값 대신 예외 발생을 출력한다. 문제는 코드의 어느 부분에서 예외를 throw해야하는지 모르며 변수가 초기화되지 않았는지 확인하는 방법을 알지 못한다는 것입니다. 도움을 주셔서 감사합니다.

+0

그럼 '던짐'은 어디 있습니까? –

+0

푸시 백 후에 nodeArray.back()을 사용하여 전체 nodeArray [max] 로직을 스켈치 칠 수 있다는 것을 알고 있습니다. – WhozCraig

답변

1

현재 operator[]은 항목의 읽기 액세스와 원래 작성을 구분하지 않습니다. 따라서, 존재하지 않는 항목의 사용에 대해서는 예외를 던지지는 못한다. 왜냐하면 염려하는 한 그 항목의 원래 작성과 차이가 없기 때문이다.

특정

  • 의 기존 디자인의 제약 내에서 다양한 기술 솔루션 (없음 정말 좋은), 당신은 operator[] 반환 그의 대입 연산자 항목을 생성하고 변환 프록시 개체를하도록 할 수있다 항목 유형은 기존 항목에 액세스합니다.

그러나 주어진 코드가 여전히 근본적인 문제가 있음을 알고 있으므로 권장하지 않습니다.

대신 현재 디자인을 버리십시오. 존재하지 않는 항목에 대한 액세스를 기본값으로 새 항목을 만들거나 만들기 및 액세스 작업을 고유하게 만듭니다. 전자는 std::map이고, 후자는 아마도 가장 쉽습니다.

+0

의견에 감사드립니다 !! 나는 창조와 접근의 operatins를 별개로 만들려고 노력할 것 같아. –