2016-05-30 3 views
0

私はAnimalの派生クラスとDogクラスの派生クラスを持っています。C++の基本クラスポインタ、コレクションクラス

私はDogCollection、CatCollectionクラスも持っています。新しい猫の追加、猫の読み込み、データベースからの猫の削除など、犬と猫のクラスへのポインタを使って特定の猫を探します。

私は、単一のコンテナでクラスを管理するために基本クラスポインタを使用するように求められました。この目的のために、別々のDogCollectionクラスとCatCollectionクラスの代わりに、DogクラスとCatクラスの読み込みと書き込みの操作を実行する方が良いでしょうか?共通のC++では

+2

コードを表示してください。あなたの最後の段落は私に少し混乱しています。私はこれが宿題であると理解しています。 'DogCollection'と' CatCollection'の代わりに 'AnimalCollection'を使うように求められているようですが、私はあなたの最終的な質問を理解できませんでした。 – Rotem

+1

私はあなたが 'Dog'sと' Cat'sへのポインタを格納する 'Animal'へのポインタのコンテナを持つように頼まれています。だから、あなたは仮想ディスパッチについて話していると思います。 – lapk

+1

私が何を探していること '犬wMyDogであると信じて、あなたは、あなたが希望インスタンスまたは一部の配列操作で特定の操作を実行する必要があるかもしれないという事実に依存し' – Ceros

答えて

2

は、あなたが通常のオブジェクトを保持するために、テンプレートのコンテナを使用することになり、このように:

#include <vector> 

class Cat; 
class Dog; 
class Animal; 

typedef std::vector<Cat*> CatCollection; 
typedef std::vector<Dog*> DogCollection; 
typedef std::vector<Animal*> AnimalCollection; 

私はコンテナとしてstd::vectorを使用しますが、利用できる他の人があります。

のように、あなたは、コンテナとしてコンテナを操作し、アイテムそのものに対して操作を実行します:特定のタイプのための特定のコレクションクラスの作成

AnimalCollection coll; 

//add elements 
Cat *cat = ...; 
Dog *dog = ...; 

coll.push_back(cat); 
coll.push_back(dog); 

//do something with the first item of the collection 
coll[0] -> doStuff(); 

//do something on all items 
for (Animal *c: coll) { 
    c -> doStuff(); 
} 

//Don't forget to delete allocated objects one way or the other 
//std::vector<std::unique_ptr<Animal>> can for example take ownership of pointers and delete them when the collection is destroyed 

は、特殊なケースで行うことができますが、それは通常はありません。

Live Demo

+0

まあ; ' 'アニマル* wAnimal = wMyDog異なるクラスにカプセル化したい – Ceros

+0

@ coyotte508 doStuff()はどのクラスに属していますか? – AppleSh

+0

'Virtual'で子クラス' Cat'と 'Dog'でオーバーライドされている場合、' Cat'や 'Dog'のものが呼び出されます。私はすぐにライブサンプルで編集します。 – coyotte508

関連する問題