2016-02-07 43 views
0

我正在一個C++類的任務之一是: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;  
    } 

然而,朋友方法不會被調用,所以異常被拋出從來沒有。

回答

1

您在

iv[3]=42; 

會因爲扔在這一點上,data[3] == 0

記住,即使你的任務你打電話operator[];它不關心(甚至不知道)你是否想要T&用於閱讀或寫作。

(其中的代碼是很簡單的,你知道如何使錯誤出現,在一般情況下,問題),通過其與調試第一踩着你應這樣那樣的問題。你會發現這一點 - 你馬上就會發現這個異常並沒有被拋出你認爲的地方。

+0

你完全正確的,這是一個新手的錯誤過目這一點。 謝謝您的回覆! –

1

當你的代碼運行iv[3] = 0,這是try .. catch之外,因爲iv[3]是在這一點零它會拋出異常。

你需要告訴當一個任務已經發生的元素。我懷疑你最好的選擇是從operator []返回代理類,然後有運營商分配和轉換到T

+0

謝謝你的建議。 我已經看過它,但是恐怕我們在C++課程期間沒有看過代理類。我試圖通過只在我試圖打印結果時拋出異常來解決它,但是現在(在改變的代碼中)我用於此的方法從來沒有被調用,我找不到原因。 –

+0

這不是那麼複雜。想象一下,你返回一些新類的對象。那麼這個類需要什麼操作才能使原始源工作? –