2017-10-21 4 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)

正しいアプローチ。私は私のような関数からcerrを許可していますか?それをキャッチせずにこの関数を投げることはできますか?私が知っている限り、コールを捕まえることなくスローすると、終わります()?この悪いコーディングの練習ですか?

私は皆さんと混乱していないと私の質問は多少理解できると思います。事前にお手伝いいただきありがとうございます:)

編集:申し訳ありませんが、私はstd :: stringと基本入出力のようないくつかの基本的なものを除いて自分自身を作成し​​ていないクラスを使用することは許可されていません。

+1

['std :: out_of_range'](http://en.cppreference.com/w/cpp/error/out_of_range)の再利用はどうですか?他の標準的な例外クラスの1つを使用/継承します([参考文献など](http://en.cppreference.com/w/cpp/error))? –

+0

ここでのポイントは再利用ではないと思いますが(ベクトル成分全体を再利用する必要があるため)、データ構造の書き方について学びます。 – Doleron

+0

@Doleronあなたは絶対に正しいです、私はそれを指定するのを忘れてしまったので、投稿を編集しました。私は自分のクラスを使用して作成する必要があり、std :: stringとstd :: cout/cerr/cinしか使用できません。 – JuliusAF

答えて

0

Javaとは異なり、C++では例外以外の要素を使用してthrow文で使用できます。したがって、あなたの構造体は、式のパラメータとして使用するのに適しています(たとえば、int型と同じように)。

あなたがプログラムを書くためにOOPのアプローチを使用しているので、あなたも、あなたの例外のクラスの代替適用する必要があります:hereから撮影

#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; 
} 

を。

第1の印象は、両方の選択肢が同等であることです。構造体ベースのクラスの利点は、クラスを使用すると、複雑で巨大で長寿命のシステムをプログラミングする際に役立つ、オブジェクト指向のアプローチによって提供される再利用、拡張、カプセル化などの利点を抽出できることです。

関連する問題