我正在学习c ++课程,其中一项任务如下:
他们给了我们一个主程序,我们不得不编写它背后的代码。这是代码:
vector<int> iv(4);
iv[3]=42;
cout << iv[3] << endl; // prints "42"
try {
cout << iv[1] << endl; // throw exception
}
catch (vector<int>::Uninitialized&){
cout << "Uninitialized vector element!" << endl;
}
return 0;
我已经为矢量模板提出了这个代码:
T* data;
unsigned int size;
public:
class Uninitialized{};
explicit vector(int size) {
data = new T[size];
this -> size = size;
for (unsigned i = 0; i < size; i++) {
data[i] = 0;
}
}
~vector() {
delete [] data;
}
T& operator[](int index) {
if (index >= size) {
abort();
}
return data[index];
}
friend ostream& operator<< (ostream& o, const T& t) {
if (t == 0)
throw Uninitialized();
else
return o << t;
}
但是,永远不会调用 friend 方法,因此永远不会抛出异常。
答案 0 :(得分:1)
你在
投掷iv[3]=42;
因为那时data[3] == 0
。
请记住,即使在您的作业中,您也可以致电operator[]
;如果你想要T&
进行阅读或写作,它并不关心(甚至不知道)。
你应该首先使用调试器来解决这类问题(并且,通常,代码很简单并且你知道如何使bug出现的问题)。你会发现这一点 - 你立刻就会发现异常并没有被抛到你想象的地方。
答案 1 :(得分:1)
如果您的代码在iv[3] = 0
... try
之外运行catch
,则会抛出异常,因为此时iv[3]
为零。
您需要告知某个元素的分配何时发生。我怀疑你最好的办法就是从operator []
返回一个代理课程,然后有{@ 1}}分配和转换的操作员。