2017-10-21 127 views
0

我創建了自己的向量類,其行爲有點像通常的std :: vector(我需要爲此分配執行此操作)。現在我想確定,如果有人試圖向這個向量類中寫入超出它可以訪問的內存範圍的東西,它會給出錯誤並終止程序。創建一個類以拋出錯誤

我嘗試:

template<typename T> 
class vector 
{ 
    private: 
     T *elements; 
     int sz; 

    public: 
     // vector functions etc. // 
     struct out_of_range 
     { 
      string s; 
      out_of_range(string b) : s{b} {cerr << "error: " << s << endl;} 
     }; 
}; 

所以現在我能遇到一個超出範圍的錯誤矢量成員函數,我把這個類。例如在【我的運算符重載,我有這樣一個檢查:

if(i < 0 || sz <= i) throw out_of_range("index out of range"); 

現在這個工程,並與下面的消息終止程序:

error: index is out of range terminate called after throwing an instance of 'vector::out_of_range' Aborted (core dumped)

我的問題是,如果這是正確的做法。我是否允許使用像我這樣的函數,並且可以簡單地拋出這個函數而不捕獲它?據我所知,拋出沒有捕獲電話terminate()正確嗎?這是不好的編碼習慣?

我希望我沒有混淆你們,我的問題有點可以理解。感謝您的任何幫助提前:)

編輯:對不起,我應該提到,我不允許使用任何類我沒有創建自己,除了一些基本的東西,如std :: string和基本輸入和輸出。

+1

如何重用['std :: out_of_range'](http://en.cppreference.com/w/cpp/error/out_of_range)?或者使用/繼承其他標準異常類之一([例如,在此參考文獻中](http://en.cppreference.com/w/cpp/error))? –

+0

我想這裏的重點不是重用(因爲這樣整個向量組件應該被重用),而是瞭解寫入數據結構。 – Doleron

+0

@Doleron你是絕對正確的,我已經編輯了這篇文章,因爲我忘了指定。我需要創建自己的類來使用,只能使用std :: string和std :: cout/cerr/cin。 – JuliusAF

回答

0

不同的Java,在C++中,您可以使用非特定於異常的元素在throw語句中使用。所以,你的結構適合用作表達式參數來拋出一個異常,這樣(就像int數一樣)。

然而,由於您使用的是面向對象的方法來編寫程序,你應該也適用於一類替代你的例外:

#include <iostream> 
#include <exception> 
using namespace std; 

class myexception: public exception { 

    virtual const char* what() const throw() { 
     return "My exception happened"; 
    } 
} myex; 

int main() { 

    try { 
     throw myex; 
    } catch (exception& e) { 
     cout << e.what() << '\n'; 
    } 
    return 0; 
} 

here服用。

第一印象是兩種替代方案都是相同的。基於結構的類的好處在於,通過類可以提取面向對象方法提供的重用,擴展,封裝等優點,這在編程更復雜,更龐大,更長壽的系統時非常有用。