私は、通常の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と基本入出力のようないくつかの基本的なものを除いて自分自身を作成していないクラスを使用することは許可されていません。
['std :: out_of_range'](http://en.cppreference.com/w/cpp/error/out_of_range)の再利用はどうですか?他の標準的な例外クラスの1つを使用/継承します([参考文献など](http://en.cppreference.com/w/cpp/error))? –
ここでのポイントは再利用ではないと思いますが(ベクトル成分全体を再利用する必要があるため)、データ構造の書き方について学びます。 – Doleron
@Doleronあなたは絶対に正しいです、私はそれを指定するのを忘れてしまったので、投稿を編集しました。私は自分のクラスを使用して作成する必要があり、std :: stringとstd :: cout/cerr/cinしか使用できません。 – JuliusAF