C++未使用变量的异常
C++ exceptions with unused variables
我有一个地图类模板,用于存储我的通用数据类型。我必须使用字符串来索引地图类。如果尝试访问未初始化的元素,我需要抛出一个未初始化的异常。主要看起来像这样:
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
所做的,后者可能是最简单的。
相关文章:
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 当使用lambda进行变量的复杂初始化时,如何处理从内部抛出的lambda外部异常
- 在类声明中初始化 const 成员变量时在调试模式下出现异常
- memcpy() 在一个类中被调用以复制到另一个类变量中后会引发异常
- 声明一个额外的变量会导致运行时出现异常
- 如果函数抛出的异常可能未捕获,如何销毁局部变量?
- GCC和Clang不警告未使用的异常变量
- 在 C++ 中的构造函数中引发异常时销毁对象的成员变量
- C++ 读取文件和写入变量时未处理的异常 - getline 错误?
- 如何释放C++异常类析构函数中的变量
- 基本类型变量的赋值计算序列,右操作数引发异常
- 条件变量wait引发异常
- 如果在静态局部变量之前出现异常,会发生什么
- 由将值分配给双精度类型的变量而导致的浮点异常
- 异常处理和成员变量
- 异常变量声明
- DLL 中的 C++ 静态局部变量初始化会导致_CrtIsValidHeapPointer异常
- 如何抛出带有变量消息的 std::异常
- 变量 C++ 的异常初始化
- 当异常变量未定义时,通过引用捕获