2017-06-12 11 views
-1

ペットクラスを初期化するときに、種として犬や猫を除外または禁止したいとします。 invalid_argument例外をスローする適切な方法は何でしょうか?オブジェクトを初期化するときにエラーが発生する

#include <string> 
using std::string; 
#include <stdexcept> 
using std:: invalid_argument; 

struct Pet { 
    const string name; 
    long age = 0; 
    const string species; 

    //Pet()= default; 
    Pet(): name("CrashDown"),age(0),species("ferret") {}; 
    Pet(const string & the_name, const string & the_species): name(the_name), age(0), 
    species(the_species) {}; 
}; 
+2

種がタイプの場合はテンプレートを使用できます。それは最も慣用的なアプローチのようです。それ以外の場合は、通常のif文を使用してctor本体をスローします。 – erip

+2

通常、実行時ではなく*コンパイル時にエラーが発生する方が良いです。より限定された「ペット」または種の宇宙が有用であろう。 –

答えて

1
Pet(const string & the_name, const string & the_species):  name(the_name), species(the_species), age(0) 
    { 
    if (species == "cats" || species == "dogs") 
    throw std::invalid_argument("received negative value"); 
    } 
2

あなたが心の中の種の特定のセットを持っている場合、私はこれを行うだろう方法は、種のために列挙を使用することです:

enum class Species { 
    horse, 
    lizard, 
    human 
}; 

その後、タイプSpeciesのクラスの種を作ります。これにより、コンストラクタに渡されたものが「承認済み」の種(つまり、enumに含まれているもの)に限定されます。これは種の有限の(そして包括的な)リストを持っている場合にのみ機能します。

種を徹底的にしたい場合は、Speciesの基底クラスを持ち、具象種のサブクラスを作成することができます。その後、テンプレートを使用して特定のタイプを制限することができます。これは、例外ではなくコンパイルエラーです。

これらのオプションが気に入らない場合は、コンストラクタ本体の文字列の等価性をチェックして、cat、a犬、または任意の他の望ましくない種。

+1

さて、サルについてはあきらめないでください;-) –

+2

しかし、あなたがすでに投票した質問の回答は、今のところ明らかにしていない方が良いでしょう。 –

+1

これは、enumクラスだけでなく、enumクラスでなければならないことに注意してください。enumは、数値を抜き出していても数値をとることができます(したがって、自分で検証する必要があります) –

関連する問題