1

潜在的に多くの頂点を含む Shape クラスがあり、重いクラスの偶発的な不必要なコピー (たとえば、参照ではなく値による受け渡し) を防ぐために、copy-constructor/copy-assignment を非公開にすることを考えていました。

Shape のコピーを作成するには、意図的に "clone" または "duplicate" メソッドを呼び出す必要があります。

これは良い習慣ですか?STL コンテナーがこのアプローチを使用しないのはなぜでしょうか。値渡しはほとんどしたくないからです。

4

5 に答える 5

7

ユーザーを制限することは、必ずしも良い考えではありません。コピーに費用がかかる可能性があることを文書化するだけで十分です。ユーザーが本当にコピーしたい場合は、コピー コンストラクターを提供して C++ のネイティブ構文を使用する方が、はるかにクリーンなアプローチです。

したがって、本当の答えは文脈に依存すると思います。おそらく、作成している実際のクラス (架空の Shape ではない) をコピーするべきではありません。しかし、一般的なアプローチとして、ユーザーに明示的なメソッド呼び出しを強制することで、ユーザーが大きなオブジェクトをコピーするのを思いとどまらせるべきだとは言えません。

于 2010-03-19T16:01:10.760 に答える
4

私見、コピーコンストラクターと代入演算子を提供するかどうかは、コピーのコストよりもクラスがモデル化するものに依存します。

クラスがvaluesを表す場合、つまり、オブジェクトまたはオブジェクトのコピーを渡しても違いがない場合は、それらを提供します (また、等値演算子も提供します)。

クラスがそうでない場合、つまり、クラスのオブジェクトにアイデンティティと状態があると思われる場合(エンティティについても話します)、そうしないでください。コピーに意味がある場合は、クローンまたはコピー メンバーを提供します。

簡単に分類できないクラスが時々あります。コンテナはその位置にあります。それらをエンティティと見なし、参照によってのみ渡し、必要に応じてコピーを作成する特別な操作を行うことは意味があります。それらを単に値の集合と見なすこともできるため、コピーは理にかなっています。STL は、値型を中心に設計されました。そして、すべてが値であるため、コンテナがそうであることは理にかなっています。これによりmap<int, list<> >、便利なことが可能になります。(コピーできないクラスを STL コンテナーに入れることはできないことに注意してください)。

于 2010-03-19T16:09:59.973 に答える
4

一般に、クラスが重いという理由だけでクラスをコピー不可にすることはありません (STL の良い例を示しました)。

ソケット、ファイル、ロックなどのコピー不可能なリソースに接続している場合、またはまったくコピーするように設計されていない場合 (たとえば、ほとんどディープコピーできない内部構造がある場合) は、コピー不可にします。

ただし、あなたの場合、オブジェクトはコピー可能であるため、そのままにしておきます。

ちょっとしたメモclone()-- ポリモーフィック コピー コンストラクターとして使用されます -- 意味が異なり、使い方も異なります。

于 2010-03-19T16:11:04.937 に答える
4

ほとんどのプログラマーは、さまざまなオブジェクトをコピーするコストをすでに認識しており、参照渡しなどの手法を使用してコピーを回避する方法を知っています。

STL のベクトル、文字列、マップ、リストなどはすべて、さまざまな形で「重い」オブジェクトと見なされる可能性があることに注意してください (特に、10,000 要素を持つベクトルのようなもの!)。これらのクラスはすべてコピー コンストラクターと代入演算子を引き続き提供するため、何を行っているか (ベクターの std::list を作成するなど) がわかっている場合は、必要に応じてそれらをコピーできます。

したがって、有用である場合はとにかくそれらを提供しますが、それらが高価な操作であることを必ず文書化してください。

于 2010-03-19T16:11:17.073 に答える
2

あなたのニーズに応じて...

コピーが誤って発生しないようにしたい場合、およびコピーを作成すると重大なボトルネックが発生するか、単に意味がない場合、これは良い方法です。コンパイル エラーは、パフォーマンスの調査よりも優れています。

クラスがどのように使用されるかがわからず、それが良いアイデアかどうかも不明な場合は、良い習慣ではありません。ほとんどの場合、この方法でクラスを制限することはありません。

于 2010-03-19T16:01:22.707 に答える