5

[編集1-3番目のポインター構文を追加しました(ありがとうAlex)]

DALにはどの方法を選びますか、またその理由は次のとおりです。

Car& DAL::loadCar(int id) {}
bool DAL::loadCar(int id, Car& car) {}
Car* DAL::loadCar(int id) {}

車が見つからない場合、最初のメソッドはnullを返し、2番目のメソッドはfalseを返します。

2番目のメソッドは、ヒープ上にCarオブジェクトを作成し、データベースから照会されたデータを入力します。おそらく(私のC ++は非常に錆びています)、それは次の行に沿ったコードを意味します:

Car& DAL::loadCar(int id)
{
    Car *carPtr = new Car();
    Car &car= *carPtr;
    car.setModel(/* value from database */);
    car.setEngineSize(/* value from database */);
    // etc
    return car;
}

ありがとう

4

2 に答える 2

5

2番目は間違いなく好ましいです。新しくなったオブジェクトへの参照を返しています。ソフトウェアを使用しているエンドユーザーにとって、返されたオブジェクトを削除する必要があるかどうかは明らかではありません。さらに、ユーザーがこのようなことをした場合

Car myCar = dal.loadCar( id );

ポインタが失われます。

したがって、2番目のメソッドは、呼び出し元にメモリの制御を置き、奇妙なミスの発生を防ぎます。

編集:参照による戻りは賢明ですが、親、つまりDALクラスが参照の存続期間を制御できる場合に限ります。つまり、DALクラスにCarオブジェクトのベクトルが含まれている場合、参照を返すことは完全に賢明なことです。

Edit2:私はまだ2番目のセットアップを好みます。3番目は最初よりもはるかに優れていますが、オブジェクトが初期化されていると呼び出し元に想定させることになります。

あなたも提供することができます

Car DAL::loadCar(int id);

そして、スタックコピーを受け入れることを願っています。

また、一種のnull車オブジェクトを作成して、「有効」なオブジェクトを返すことができますが、すべてのフィールドに有用な情報が返されないことを忘れないでください(したがって、明らかにデータをゴミ箱に初期化します)。これはヌルオブジェクトパターンです。

于 2009-10-05T13:22:24.023 に答える
4

とにかくヒープにオブジェクトを割り当てているので、問題が発生した場合にNULLを返すCar * LoadCar()を検討しないでください。このようにして、参照型に制限がなく(各参照を初期化する必要があります)、エラーの場合を通知する手段もあります。

于 2009-10-05T13:28:17.180 に答える