1

いくつかのdouble値をベクトル(mpValuesと呼ばれる)に格納し、それらの平均を計算するC++クラスを作成しています。構築されると、値の配列は空になるため、この計算を実行すると0.0/0.0が返されます。

ゼロ値の平均を求めるのはエラーだと判断しました。したがって、NaNを返してエラーメッセージを表示し、ユーザーにその問題を認識させるのが最善です。コードは次のようになります。

double Average::CalculateAverage() const
{
    if(mpValues->size() == 0){
        std::cerr << "Instance of Average at: " << this << " contains no values.\n"
                  << "In this case the arithmetic mean is defined as NaN." <<std::endl;

        return 0.0/0.0;
    }
    else{
        ...calculate the arithmetic mean
    }
}

これは賢明なアプローチですか、それとももっと良い提案がありますか?普段はそんなにうるさくはありませんが、これは求人のテストなので、悪い決断は避けたいと思います。

前もって感謝します!

4

5 に答える 5

7

標準オプションは、NaN を返すか、例外をスローするか、boost::optional などのオプションを返すことです。それぞれに長所と短所があり、多くの人々によって詳細にレビューされています. 関数内でエラー メッセージを表示しないでください。これは、単一責任の原則に違反するためです。

于 2012-10-03T08:23:07.223 に答える
3

あなたはすでに質問に答えています:

ゼロ値の平均を求めるのは誤りだと判断しました。

したがって、NaN を返したり、ゼロ除算を処理したりする必要はありません。独自の例外クラス (EmptyVectorError など) を作成し、それをスローしてキャッチすることができます。

于 2012-10-03T08:20:31.110 に答える
1

これは C++ の質問なので、C++ で回答する必要があります。単一責任の原則 (Don Reba が言及) から、関数内からエラーを報告することは実際には適切ではないと結論付けています。主なオプションは 2 つあります。

1average(container)空のコンテナーでの呼び出しが未定義の動作(UB)であることを明確に指定します。これは、C++stdライブラリの多くのアルゴリズムで標準的な方法です。空のコンテナの可能性を無視して、ただ返すことができますsum/size()。デバッグモードで追加assert(size()>0);(または類似) することができます。

2 APIで空のコンテナを明示的に許可します(これはあなたが望んでいたことだと思います)。この場合、返品sum/size()は不適切です。NaNエラー設定によっては、シグナルを返したりトリガーしたりする場合がありますが、キャッチするのは簡単ではありません(標準ライブラリ関数ではないNaNと思います)。isnan()したがって、どういうわけか、未定義の結果をクリーンな方法で返す必要があります。これは、適切な例外をスローするかboost::optional<>、エラーではない未定義の値を明示的に許可する (usta によって提案されている) などの型を返すことによって実行できます (とは異なりますNaN) double

C++ で最も適切な方法として例外をスローすると考えています (オプション 2 を選択する場合)。

于 2012-10-03T09:09:41.837 に答える
0

戻り値の型を に変更することboost::optional<double>をお勧めします。

ドキュメントへのリンク

于 2012-10-03T08:18:04.820 に答える
-1

NaN を返すか、例外をスローするかの 2 つのオプションがあります。何をすべきかは、用途によって異なります。

1) クライアントは平均のみを表示します。その場合、単純に NaN を返すことを選択します。このように、クライアントは、気にしない何かのためにエラー処理コードを書くことを強制されません。

2) クライアントは平均値を使用して新しい値を計算します。その場合は困難です。例外をスローすることで、例外を明示的に処理するよう強制します。これは良いことです。一方、二重値 NaN は、私の知る限り、計算に使用できます。また、残りの作業にも依存します。常に例外を使用する場合は、例外も使用する必要があります。常にエラー コードを使用する場合は、NaN を使用する必要があります。混ぜた場合は、それをきれいにする必要があります。

PS: 0.0/0.0 とは書きませんが、代わりにstd::numeric_limitsを使用します。読みやすくなっています。

于 2012-10-03T08:30:07.580 に答える