我正在上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&

您应该通过首先使用调试器来逐步解决此类问题(通常,这些问题是代码足够简单并且知道如何使错误出现的问题)。您可能已经抓住了这一点-您会立即看到没有将异常引发到您认为的位置。

07-28 02:04
查看更多