0

クラスと同じ型のオブジェクトを返すクラスの静的メソッドがあるとします。たとえば、オブジェクトを作成するには、このメソッドは文字列を解析する必要があります。

class C
{
public:

   static C get_obj(const std::string& str)
   {
      C obj;
      // Parse the string and set obj properties
      return obj;
   }
};

文字列を解析するときにエラーが発生し、オブジェクトを有効なオブジェクトとして構築できない場合、例外をスローする必要がありますか?

4

4 に答える 4

3

例外をスローする必要があると思います。このようにして、obj を取得できなかったことをクライアントに通知し、これに対処するよう強制します。

重要でない (重要でない) 場合は、C問題が発生したことを示すセンチネル値として機能するスペシャルを返すことができます。クライアントは、それについて何かをするかどうかを選択します。

私は例外的に行きます。2 番目の方法はお勧めしません。

于 2012-07-06T19:23:44.613 に答える
3

失敗の可能性があることを考えるとget_obj、何らかの方法で呼び出し元に失敗を報告する必要があります。これは通常、

  • 例外のスロー
  • メソッドの出力で失敗を伝える

この特定のケースでは、メソッドの唯一の出力はCインスタンスです。例外をスローすることが、このシグネチャのメソッドにとっておそらく最良のオプションであることを考えると。他の唯一の選択肢は、成功/失敗をオブジェクト内に埋め込むCことです。これは、ほぼ確実にやりたくないことです。

この問題にアプローチするもう 1 つの方法は、try_parseパターンです。returnboolで成功/失敗を示し、成功時に参照パラメーターを介して構築されたオブジェクトを返すようにします。

bool try_parse(const std::string& str, C& obj) {
  if (string is valid) { 
    obj = C(...);
    return true;
  }

  return false;
}
于 2012-07-06T19:26:15.827 に答える
0

はい、例外をスローすることは完全に有効です。オブジェクトを構築するときと同じ理由で、オブジェクトの構築を続行できない場合、例外をスローする以外に選択肢はほとんどありません。

于 2012-07-06T19:22:16.810 に答える
-1

はい、例外をスローする必要があります。

class C
{
public:

   static C get_obj(const std::string& str)
   {
      try
      {
          C obj;
          // Parse the string and set obj properties
          return obj;
      }
      catch (int x)
      {
        cout "blahblah";
      }
   }
};

オブジェクトを構築できない場合、変数が 0 になるリスクがあり、さらに多くの問題を引き起こす可能性があります

于 2012-07-06T19:22:03.780 に答える