4

プログラミング中に、次の設計上の選択に何度も遭遇しました。ユーザーがオブジェクトを作成し、それを別のオブジェクトに渡し、第 2 段階で何らかの方法で処理します。

例として、レイトレーサーを想像できます。ユーザーは、特定のプロパティを使用して球体を作成し、 を呼び出しますraytracer.addTraceable(sphere)。さて、これを行うには3つの方法が考えられます。

  1. レイトレーサーは、球体オブジェクトに割り当てられたメモリの割り当てを解除する責任を負います
  2. ユーザーは、球体オブジェクトに割り当てられたメモリの割り当てを解除する必要があります。
  3. レイトレーサーは球体オブジェクトをコピーするだけで、ユーザーとレイトレーサーの両方がローカル コピーの割り当てを解除します。

このような場合、一般的にどのような設計を選択するのが最善でしょうか? 私が言及したもの以外に他のオプションはありますか (スマート ポインターは含まれません)。

PS: オブジェクト指向のアプローチを使用しているときに、単純な C で同じ問題に遭遇しました。

4

3 に答える 3

6

RAIIの一貫した使用により、これは論点になります。オブジェクトなどのスマート ポインターを使用すると、すべてstd::shared_ptrのポインターによって所有され、最後のポインターが破棄された後に削除されます。

C には、RAII イディオムを表現するための便利な方法が実際にはありません。

于 2013-10-07T03:49:11.297 に答える
2

スマート ポインターが問題を解決してくれることはわかっているようですが、説明できない理由でスマート ポインターを却下しているようです。(おそらく、コードが C と C++ の両方で機能する必要があるためでしょうか?)

sphereオブジェクトがオブジェクトによって管理されている場合raytracer、論理的にはオブジェクトの所有権を取得します。ただし、このアプリケーションに適した選択肢を除外しました。

  • ユーザーは、 に追加するオブジェクトのプロパティを指定しraytracerます。これにより、オブジェクトの作成と破棄が行われます。

その後raytracer、ファクトリのようなものになり、プロパティ オブジェクトはビルダーのようなものになります。

于 2013-10-07T03:28:27.890 に答える