【发布时间】:2015-02-01 11:57:29
【问题描述】:
我有一个地图类模板,用于存储我的通用数据类型。我必须使用字符串来索引地图类。如果尝试访问未初始化的元素,我需要抛出未初始化的异常。主要是这样的:
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)元素。我已经实现了一个 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 附近移动)而不是抛出异常。问题是我不知道应该在代码的哪一部分抛出异常,也不知道检查变量是否未初始化的方法。 我会很感激任何帮助。
【问题讨论】:
-
那么你的
throw呢? -
你知道你可以在你的推回之后通过简单地使用
nodeArray.back()来压制整个nodeArray[max]逻辑。
标签: c++ exception initialization throw