我正在上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方法,因此永远不会引发异常。
最佳答案
你在扔
iv[3]=42;
因为那时
data[3] == 0
。请记住,即使在您的作业中,您也正在呼叫
operator[]
;它并不关心(甚至不知道)您是否要读取或写入T&
。您应该通过首先使用调试器来逐步解决此类问题(通常,这些问题是代码足够简单并且知道如何使错误出现的问题)。您可能已经抓住了这一点-您会立即看到没有将异常引发到您认为的位置。