2

追加情報を添付したいコンテナタイプがあるとします。私のアプローチは、コンテナーと情報を保持するクラスを定義することです。コンテナのメソッドを模倣する新しいクラスのメソッドを定義するのは良い習慣ですか? たとえば、書く代わりに、私は書きmyContainerObject.internalVector[i]たいと思いますmyContainerObject[i]。使用したいすべてのメソッドを再定義する必要があります(size(), push_back()など)。このようなアプローチの欠点は何ですか? どのような代替案が存在しますか (たとえば、コンテナーから継承する方が良い解決策ですか?)。

4

3 に答える 3

2

私が考えることができるコンテナであるタイプを把握する可能な方法:

  1. コンポーネントが内部コンテナになるデコレータ(これがあなたが求めているものです)を提供します。これは、準拠する必要がある厳密なインターフェースがある場合に機能します。それは良い習慣でも悪い習慣でもありません。デコレーターのデザインパターンについて読んでください。

  2. コンテナーの代わりに、アルゴリズムで反復子の概念を使用します。これは一般的なアプローチであり、stl アルゴリズムの実装方法

  3. (2) と同様に、コンテナーの概念を使用します。型がコンテナーかどうかを検出し (SFINAE トリック)、それを操作します。

  4. コンテナ インターフェイスを再実装します。かなりの労力やノウハウが必要になるので、それを行うには本当に強い理由が必要です。いくつかの情報: http://stdcxx.apache.org/doc/stdlibug/16-3.html

一般に、ユースケースが非常に些細なものであるか、特定の要件がある場合を除き、クラスの内部状態 (myContainerObject.internalVector[i]) を外部の世界に公開しないでください。

于 2013-07-24T08:20:04.910 に答える
2

転送関数で構成を使用していますが、STL コンテナーのような具体的なクラスを使用するのは正しいことです。1 つの欠点は、許可するすべての関数のすべてのオーバーロードを、引数を転送するためだけに再定義しなければならないことですiterator

別の方法としては、 public を継承することはなく、 private継承のみを使用して(STL コンテナーのデストラクタがpublic仮想であるため)、カスタム クラス内でusing-declarationsを使用して、基底クラスの関数と型の名前をスコープに持ち込む (必要using Base::name;関数のすべてのオーバーロードに対して1 つだけ)。

于 2013-07-24T08:10:19.820 に答える