コンテナクラスまたは他のクラスをプライベートまたはパブリックメンバーとしてクラス内に配置するための最良の方法は何ですか?
要件:
1.クラス内のVector<someclass>
2.ベクトルの追加とカウントが必要なインターフェイス
コンテナクラスまたは他のクラスをプライベートまたはパブリックメンバーとしてクラス内に配置するための最良の方法は何ですか?
要件:
1.クラス内のVector<someclass>
2.ベクトルの追加とカウントが必要なインターフェイス
あなたはクラスについて話しているので、私はそれがプライベートであるべきだと思います。公開したい場合は、構造体を作成して、メンバー変数を使用することを明確にします。
メンバーを公開するための実行可能な代替手段vector
は、ビジター関数(または内部イテレーター)を作成することです。このようにして、デメテルの法則によく従います。
class ContWrapper {
std::vector<int> _ints;
public:
class Action {
public:
virtual void accept( int i ) = 0;
};
void each_int( Action& a );
};
また、たとえばライブラリからエクスポートする場合も、十分に注意しstd::vector<T>
てください。クライアントコードは、使用したのと同じSTL実装を使用しない可能性があるため、これらのメンバー変数のレイアウトが異なる場合があります。
メンバーがプライベートまたはパブリックとして宣言されるかどうかは、アプリケーションに完全に依存します。もう少し詳しく教えていただけますか?
メンバーを宣言するときに覚えておくべき重要なポイントの1つは、メンバーを取得するための「ゲッター」を提供すると、そのオブジェクトをカプセル化できなくなるということです。代わりに、公開したい機能のみを公開するラッパーメソッドを作成することをお勧めします。
たとえば、Vectorメンバーを使用して、公開したいすべての機能である場合は、PASSWORDメソッドとClearメソッドを記述できます。
コンテナーの状態がクラスの不変条件の一部である場合は、可能であれば非公開にする必要があります。
たとえば、コンテナーが 3 次元のベクトルを表す場合、不変条件の一部として、常に正確に 3 つの数値が含まれている可能性があります。これを public メンバーとして公開すると、クラスの外部のコードがコンテナーのサイズを変更できるようになり、コンテナーのサイズを一定にする必要があるルーチンで問題が発生する可能性があります。コンテナーを非公開にすると、コンテナーのサイズをクラスのメンバー関数に変更できるソフトウェア内の場所が制限されます。
すべてのメンバーをプライベートにし、アクセサーメソッドを使用します。これにより、後で実装を変更できます。非常に珍しい状況でのみ、データメンバーを公開します。
実装の変更は、想像以上に頻繁に行われることを忘れないでください。これは、コンテナのタイプを変更する場合だけでなく、メカニズムを変更したい場合もあります。名前をリストに保存していたとしましょう。しばらくすると、このリストにハッシュのインデックスを付けて、新しい名前を追加するたびにハッシュを更新したいと思うかもしれません。実装が適切にカプセル化されている場合、これを行うのは簡単です。ベクトルを公開したばかりの場合は、インターフェイスを調整する変更を加える必要があります(したがって、変更は波及します)。
これが初めての場合は、次の記事を読んでください:http: //en.wikipedia.org/wiki/Encapsulation_(classes_-_computers)
3番目の方法があります-コンテナから継承し、そのメソッドをオーバーライドして目標を達成する方が良い場合があります(たとえば、スレッドセーフ)。とにかく、それを公開することはほとんどの場合良い考えではありません。
コンテナを別のクラス内にカプセル化することを考慮すると、それをパブリックにすることはできません。また、クラスのパブリックメソッドは、コンテナに固有の実装を公開するべきではありません。そうすれば、クラス(つまりコンテナ)の実装を、そのインターフェースを変更せずに変更できます。