2

デフォルトとして何を返せばよいかわかりません。

myDrugs専用vector<Drug*>コンテナです

Drug* DrugDealer::getFirstDrugInSack(DrugType drugtobuy)
{
    for (int i = 0; i < myDrugs.size(); i++)
    {
        if (myDrugs[i]->getType() == drugtobuy)
            return myDrugs[i];
    }

    return 0; // is this right?
}

だから私はそれを次のように呼びます:

Drug *d = DrugDealer->getFirstDrugInSack(DrugType::Weed);
if (d != 0)
    // do something
else
    // onose?

または、これを行うより良い方法はありますか?

4

7 に答える 7

12

関数が値を見つけることを期待しているかどうかに依存すると思います。これは、関数がどれだけ明確に定義され、まとまりがあり、クライアント コードにどのようなタイプのコントラクトを提供しているかにかかっています。

値が見つからないことが許容される場合、この場合に NULL ポインターを返すことは、値が見つからなかったことをクライアント コードに示す方法として有効であると言えます。

値が見つからないことが例外的な状況であり、これが何か問題があることを示している場合は、おそらく次のアプローチのいずれかが適切です。

  • 例外をスローします。
  • NULL を返すことと組み合わせてアサートする。これらは (通常) リリース ビルドからコンパイルされるため、単独でアサートすることは通常お勧めしません。

あなたの場合、NULLを返すことは許容できると思いますが、上記のように、これは状況ごとに変化し、ここに適用する特定の「経験則」はありません。

于 2009-11-12T00:07:41.720 に答える
6

0 よりも NULL を好む人もいます。例外を発生させることもできます。

于 2009-11-12T00:06:02.613 に答える
4

NULL を返すことは問題ありません。また、ポインターをパラメーターとしてポインターに渡し、ブール値を返すことを検討することもできます。見つかった場合は true 、そうでない場合は false です。

bool DrugDealer::getFirstDrugInSack(DrugType drugtobuy, Drug** out)
{
    for (int i = 0; i < myDrugs.size(); i++)
    {
        if (myDrugs[i]->getType() == drugtobuy) {
           *out = myDrugs[i];
           return true;
        }

    }

    return false;
}

呼び出し:

Drug* d;
if (dealer->getFirstDrugInSack(dragType, &d)) {
  // Found it, use it
}
于 2009-11-12T00:08:18.087 に答える
1
Drug *myDrug = NULL;
In the loop, myDrug = myDrugs[i] followed by break;
and return myDrug.
于 2009-11-12T00:05:29.183 に答える
1

次の 3 つのオプションがあると思います。

  1. 0 を返す
  2. 例外をスローする
  3. Null オブジェクト パターンを使用する

1) 例外を回避したい場合は、0 をテストする必要があるという欠点があります。最新の C++ コードを記述する場合、これは適切な方法ではありません。コードが不安定になり (多数の if が発生)、例外によってコードが遅くなる可能性があるためです。例外 ;-) )

2) 同じこと、状況がありそうにない場合の唯一の方法

3) これにより、すべてのケースでコードが機能します。薬物があるかどうかを確認する必要がある場合にのみ、0 ではなく、定義された NullObject と比較する必要がありますstd::shared_ptr。新しい C++ 標準ライブラリの一部です。古い STL を使用boost::shared_ptrしている場合は、ヘッダーのみのテンプレート クラスを使用できます)。

参考までに: 見つけたデザイン パターンを集めて、概要リストにまとめました http://www.color-of-code.de/index.php?option=com_content&view=article&id=68:software-patterns&catid=43:design&Itemid=66。見つけたエントリのウィキペディアへのバックリンクがあります。

編集: Null Object Pattern のみのリンク:http://en.wikipedia.org/wiki/Null_Object_pattern

于 2009-11-12T00:15:19.010 に答える
0

はい、これでOKです。オブジェクトがない場合があまり頻繁に発生せず、それらのオブジェクトを処理するコードが複雑になる場合は、例外の使用を検討してください。

于 2009-11-12T00:07:02.517 に答える
0

利用できる別のオプションは、 NullObject を返すことです

ドラッグを返します::NullDrug;

基本的に「NUll」と見なされる有効なドラッグ オブジェクトは、使用しても壊れないことを意味します。

ただし、通常は 0 を返します。

良い、

通常、スマートptrsを使用します。

于 2009-11-12T00:13:04.190 に答える