C++未使用变量的异常

C++ exceptions with unused variables

本文关键字:异常 变量 未使用 C++      更新时间:2023-10-16

我有一个地图类模板,用于存储我的通用数据类型。我必须使用字符串来索引地图类。如果尝试访问未初始化的元素,我需要抛出一个未初始化的异常。主要看起来像这样:

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 元素的引用。如果向量中不存在给定字符串,则此运算符 [] 重载也将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 周围移动),而不是抛出异常。问题是我不知道应该在代码的哪个部分抛出异常,也不知道检查变量是否未初始化的方法。我将不胜感激任何形式的帮助。

您当前的operator[]不区分读取访问权限和项目的原始创建。因此,它不能为使用不存在的项目抛出异常,因为就它而言,与该项目的原始创建没有区别。

现有设计的约束下,有各种技术解决方案(没有一个是非常好的),特别是

  • 您可以让operator[]返回一个代理对象,该对象的赋值运算符创建一个项目,并且该对象转换为项目类型将访问现有项目。

但是看到给定的代码仍然存在非常基本的问题,我不建议这样做。

相反,放弃当前的设计。将不存在项的访问权限默认为创建新项,或者使创建和访问的操作不同。前者是std::map所做的,后者可能是最简单的。