2017-11-07 12 views
-3

したがって、try-throw-catchを使用してコンストラクタで指定されたパラメータを持たないオブジェクトを作成することを制限します。これまで私が書いたことは次のとおりです。しかし、それは正常に動作していない、私は何をすべきか?コンストラクタの例外 - C++

Person a(); 

厄介な解析:エラーは、ちょうど0

+4

'人()で、カスタム例外をスローし、キャッチすることができます'Person'を返します。これは 'Person'型の変数の定義ではありません。 'Person a;'や 'Person a {};を書くことができます。' Person'にはデフォルトのコンストラクタがないのでコンパイルできません。 –

+0

これを行うには、 '' Person''インスタンスを作成する '' main''関数でtry-catchを実行するのが適切です。これにより、年齢が無効であっても、 '' Person''インスタンスの年齢が無効であれば、 '' Person''インスタンスが作成されます。 – ub3rst4r

+0

また、 'Person a;'と言っても、デフォルトではないコンストラクタを用意しているので、デフォルトコンストラクタが合成されていないためコンパイルされません。 –

答えて

2

問題1を返します。これは、変数を宣言せず、コンストラクタを呼び出すと、aという関数が宣言され、Personを返します。

ソリューション:

Person a; 

が、これは問題2設定:デフォルトのコンストラクタがありません

を。 Person(int _age)を指定すると、デフォルト以外のコンストラクタが定義され、コンパイラはデフォルトの(パラメータなしの)コンストラクタを生成しないようにします。あなたが述べた目標はパラメータなしでPersonを構築することができないため、これは実際にあなたにとって勝利です。

あなたは

Person a; 

あなたは

Person a(<an int>); 

これは、これは使用するための素晴らしい例を設定anyone not from Ork.のために少し意味があります

Person a(-1); 

からユーザーを防ぐことはできませんしなければならないことはできませんコンストラクタで例外が発生し、問題3が発生します。

コンストラクタからプログラムを終了しない2つの方法があります。構築されたオブジェクトとスローされた例外があります。コンストラクタでシグナルの構築が失敗したという例外をスローして捕捉することは、不適切に構築されたオブジェクトを返すことができるため、珍しいことです。

ので

Person(int _age) 
{ 
    age = _age; 

    try 
    { 
     if (age == -1) // probably should reject age < 0 
     { 
      throw 1; 
     } 
    } 

    catch (int x) 
    { 
     cout << "You have to specify person's age" << endl; 
    } 
} 

は実際にあなたが避けるようにしようとしている問題が発生します。

ソリューション:

Person(int _age) 
{ 
    age = _age; 
    if (age == -1) 
    { 
     throw 1; 
    } 
} 

main

int main(void) 
{ 
    try 
    { 
     Person a(); 
     // use a 
     return 0; 
    } 
    catch (int x) 
    { 
     cout << "You have to specify person's age" << endl; 
     return -1; 
    } 
} 

で行うことができる一つの大きな改善があります:例外有意義

は1を投げ作る意味のあるものにする少なすぎるコンテキストが含まれています。`はパラメータを取らない関数の宣言であり、あなたはこのstd::runtime_errorような単純なもののために

Person(int _age) 
{ 
    if (_age == -1) 
    { 
     throw std::runtime_error("You have to specify person's age"); 
     // do not new an exception. It's hard to clean up and free the memory 
    } 
    age = _age; // why assign then test? Save a clock cycle. 
} 

`からと main

int main(void) 
{ 
    try 
    { 
     Person a(); 
     // use a 
     return 0; 
    } 
    catch (const std::exception & e) // where possible catch by constant reference 
    { 
     cout << e.what() << endl; 
     return -1; 
    } 
}