2011-12-30 15 views
0

からリカバリすると、C++の "到達不能"エラーから回復できますか?この関数のように到達不能エラーベクトル

vector<int> numbers; 

bool isAccessable(int i) 
{ 
    try 
    { 
    numbers[i]; 
    catch (...) 
    { 
    return false; 
    } 

return true; 
} 

それはC#で可能ですが、C++?

+0

フロー制御の例外を使用することは悪い考えです。 'if(i> = 0 && i

答えて

3

あなただけのインデックスは、単に、範囲内にあるかどうかを確認したい場合:

return i < numbers.size(); 

(あなたはまた、ゼロとの比較、または符号なしの型にインデックスを変更する必要があります。size_tは通常タイプです配列のインデックスに使用)インデックスが範囲外の場合は、値にアクセスしようとすると、例外をスローする場合は、使用

atむしろ[]より:。

try { 
    do_something_with(numbers.at(i)); 
    return true; 
} catch (std::out_of_range const &) { 
    return false; 
} 
+0

関数が[]を使用している場合はどうなりますか? – mikbal

+0

@mikbak:残念ながらそうではありません。[[] 'は、インデックスが範囲外である場合、未定義の動作をしますが、余分なエラーチェックを追加する 'vector'の実装を使用しない限り、 –

+0

ありがとう。私はソースコードを要求し、それを変更します。 – mikbal

3

C++では、演算子[]の範囲チェックはありませんが、vector :: at()があります。

ではなく

numbers.at(i); 

を試してみてください。

+0

operator []は範囲チェックを実行できますが、必須ではありません。 at()は範囲チェックを必要とします。 – Sjoerd

+0

Ok、C++では 'operator []'の範囲チェックが*たいていは*ありません。 :-) –

1

std::vector::at()メンバー関数を使用してください。 out_of_range例外がスローされます。

関連する問題