2015-02-01 2 views
0

У меня есть шаблон класса карты, в котором я храню свой общий тип данных. Я должен использовать строки для индексации класса карты. При попытке получить доступ к неинициализированному элементу мне нужно исключить неинициализированное исключение. Основной выглядит следующим образом:Исключения 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, который будет хранить ключ (строка) и значение элементов (Т). Я выполнил перегрузку operator [], которая вернет ссылку на элемент T. Эта перегрузка operator [] также будет 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) вместо того, чтобы выбросить исключение. Проблема в том, что я не знаю, в какой части кода я должен использовать исключение, и я не знаю, как проверить, не является ли переменная неинициализирована. Буду признателен за любую помощь.

+0

Итак, где ваш «бросок»? –

+0

Вы знаете, что вы можете подавить всю логику 'nodeArray [max]', просто используя 'nodeArray.back()' после вашего push-back. – WhozCraig

ответ

1

Ваш текущий operator[] не проводит различия между доступом для чтения и оригинальным созданием элемента. Таким образом, as-it не может генерировать исключение для использования несуществующего элемента, поскольку, насколько это известно, нет никакой разницы с оригинальным созданием этого элемента.

Существуют различные технические решения (ни один действительно хороший) в рамках ограничений существующей конструкции, в частности

  • вы можете позволить operator[] возврат прокси-объект, уступка оператор создает элемент, и чье обращение к к тип элемента обращается к существующему элементу.

Но, видя, что данный код по-прежнему имеет очень серьезные проблемы, я бы не рекомендовал это.

Вместо этого вырезать текущий дизайн. Либо сделайте доступ к несуществующему элементу по умолчанию для создания нового элемента, либо сделайте операции создания и доступа различными. Первое - это то, что делает std::map, последнее, пожалуй, самое простое.

+0

Спасибо за отзыв! Я думаю, что я попытаюсь сделать операции создания и доступа различными. –