0

Cheeseクラスがあります。vector<Cheese>私のプログラムでは、チーズのコレクション、主にオブジェクトを扱っています。

eat()次のようなチーズコレクションができるようになりたいです。

vector<Cheese> cheeses;
//cheeses = ...
cheeses.eat();

これを行う方法?vector<Cheese>クラスに新しいメンバー関数を追加するにはどうすればよいですか?クラスをサブクラス化しvector<Cheese>、サブクラスに名前を付けてCheeseCollectionそこにメンバー関数を追加する必要がありますか、それとももっと良い方法がありますか?

私はObjective-Cから来て、クラスに関数(「メソッド」)を追加できるカテゴリに慣れています。そのようなものはC++で利用できますか、それともC ++でクレイジーのようにサブクラス化する方が自然だと考えられていますか?

4

3 に答える 3

6

どちらでもありません-あなたが望むのはアルゴリズムです。1つのチーズオブジェクトを食べる方法をすでに知っていると仮定すると、eatそれをコレクション全体に適用すると、次のようになります。

std::for_each(cheeses.begin(), cheeses.end(), eat).

他のいくつかの言語とは異なり、C ++は、実際には意味がない場合でも、オブジェクト指向へのスラブな順守を維持しません。

于 2012-12-02T19:51:10.190 に答える
6

C ++では、このためにメンバー関数を使用することはありません–無料の関数を使用してください:

void eat(std::vector<Cheese> const& cheeses) {
    // …
}

これは、構文が異なっていても(そして、メンバーアクセスを使用していない場合でも)、これらのObj-Cカテゴリとほぼ同じです。

標準ライブラリコンテナクラスは、アプローチが失敗するようにサブクラス化できるように設計されていませんでした。あなたができることは、継承の代わりに構成を使用することです。つまりCheeseCollection、メンバーとしてチーズのベクトルを含むクラスがあります。これには、全体的な設計によっては、いくつかの利点があります。ただし、一般的に、上記は最もC++icのソリューションです。

于 2012-12-02T19:47:42.507 に答える
3

実行できることの1つは、ベクトルを使用(カプセル化)する独自のクラスを定義することです。

class Cheeses
{
  vector<Cheese> v;
public:
  void eat()
  {
    v.erase();
  }

  // plus other methods which delegate to the contained vector
};
于 2012-12-02T19:51:38.007 に答える