[タイトル]
- カテゴリ以下の犬と猫:
class Pet
{
private:
string m_type;
public:
Pet(string _type){ m_type=_type; }
string GetPetType(){ return m_type; }
};
class Dog : public Pet
{
public:
Dog() : Pet("dog"){}
};
class Cat : public Pet
{
public:
Cat() : Pet("cat"){}
};
- 以下の機能を達成するために必要な:
- 追加:例の猫や犬のクラスのメソッドをキュークラスに
- pollAll:(キューの順で)チーム記載されたチーム
- pollDog:犬のクラスのインスタンスは、キューの順序に従ってキューをデキュー
- pollCat:共感
- isEmpty:キューが空であるかどうか
- isDogEmpty:キュークラスのインスタンスの犬があるかどうかをチェック
- isCatEmpty:共感
[分析]
- 二匹の犬や猫は、すべてのペットサブクラスのクラスです。明らかに、最も適切な方法は、同じクラスの内部に2つのキューの組み合わせを使用することです。質問があるので、どのようにそれの2つのキューを決定するために、チーム合計?
- チームに全順序を決定することは、満たすために主にあるpollAllのメソッドの実装を。
- 我々はこの2つのクラスのラッパーを行うことができますので、本の中で明確に、猫や犬の元のクラスを変更しないことをお勧めを指摘しました。データタイプは、統一データ型としてペットの猫と犬、ペットによって表されます。
- タグのデザインタイムスタンプは、チームのために記録することができます
ここで質問です:今、それは同じ型にパッケージ化されているので犬や猫は、なぜだけでなく、店にキューを使用することを?
我々は唯一のストレージのための待ち行列に、複雑さが大幅に増加する場合は、操作に基づいて、それぞれ、7操作上の4を検討する必要があるため。
これは、この質問を調べた非常に明白である、特定の問題を分析し、特殊なデータ構造を設計することです
【リアライズ】
- 実装言語:C ++
- ソース
/*猫狗队列*/
#include<iostream>
#include<string>
#include<queue>
using namespace std;
class Pet
{
private:
string m_type;
public:
Pet(){}
Pet(string _type){ m_type=_type; }
string GetPetType(){ return m_type; }
};
class Dog : public Pet
{
public:
Dog() : Pet("dog"){}
};
class Cat : public Pet
{
public:
Cat() : Pet("cat"){}
};
//将两个同父类的子类(Cat And Dog)包装起来
//方便用同种泛型的Queue包装起来
class PetEnterQueue
{
private:
Pet m_pet;
long m_count; //这个类的最终目的:就是包装一个时间戳,以确定入队的顺序
public:
PetEnterQueue(Pet _pet,long _count)
{
m_pet=_pet;
m_count=_count;
}
Pet getPet() { return m_pet;}
long getCount(){ return m_count;}
string getType(){ return m_pet.GetPetType();}
};
//猫狗队列类
class CatAndDogQueue
{
private:
queue<PetEnterQueue> m_catQueue; //猫队列
queue<PetEnterQueue> m_dogQueue; //狗队列
long m_Count; //队列元素的个数
public:
CatAndDogQueue(){ m_Count=0; } //构造函数中将容量设为0
//主要操作函数
//add:方法将cat类或dog类的实例放入队列
void add(Pet pet)
{
if(pet.GetPetType()=="dog") //狗元素
m_dogQueue.push(PetEnterQueue(pet,m_Count++));
else if(pet.GetPetType()=="cat")
m_catQueue.push(PetEnterQueue(pet,m_Count++));
else
cout<<"添加的元素类型有误,请检查!"<<endl;
}
//pollAll : 将队列出队(按照队列的先后顺序)
Pet pollAll()
{
Pet pet;
if(!m_catQueue.empty()&&!m_dogQueue.empty()) //两个队列皆不为空时
{
if(m_catQueue.front().getCount() > m_dogQueue.front().getCount())
{
pet=m_dogQueue.front().getPet();
m_dogQueue.pop();
}
else
{
pet=m_catQueue.front().getPet();
m_catQueue.pop();
}
}
else if(!m_dogQueue.empty())
{
pet=m_dogQueue.front().getPet();
m_dogQueue.pop();
}
else if(!m_catQueue.empty())
{
pet=m_catQueue.front().getPet();
m_catQueue.pop();
}
else
{
cout<<"当前队列为空队,无法出队!"<<endl;
return pet;
}
return pet;
}
//pollDog:将队列的dog类实例按照队列的先后顺序出队
Pet pollDog()
{
Pet pet;
if(m_dogQueue.empty())
{
cout<<"狗队为空,无法出队"<<endl;
return pet;
}
pet=m_dogQueue.front().getPet();
m_dogQueue.pop();
return pet;
}
//pollCat:同理
Pet pollCat()
{
Pet pet;
if(m_catQueue.empty())
{
cout<<"猫队为空,无法出队"<<endl;
}
pet=m_catQueue.front().getPet();
m_catQueue.pop();
return pet;
}
//isEmpty:队列是否为空
bool isEmpty()
{
return m_dogQueue.empty()&&m_catQueue.empty();
}
//isDogEmpty:检查队列是否存在dog类实例
bool isDogEmpty()
{
return m_dogQueue.empty();
}
//isCatEmpty:同理
bool isCatEmpty()
{
return m_catQueue.empty();
}
void ShowCount()
{
cout<<"dog count : "<<m_dogQueue.size()<<endl;
cout<<"cat count : "<<m_catQueue.size()<<endl;
//cout<<"合计 : "<< m_dogQueue.size()+m_catQueue.size()<<endl;
}
};
[また]
- 名前が示すように、「サブクラスマネージャ」は、それもスーパークラスの異なるサブクラスのコレクションを管理することができます。これは、他のデータ構造に適用するように拡張することができます
- C ++では、サブクラスのインスタンスは、親クラスのインスタンスを変換し(私の印象では、それは、それが提唱されていないされていません)。そして、Javaの上にキャストすることができます。したがって、PollCat()メソッドなどで直接バックPET(親型)のサブクラスC ++ Iの型を返すことができます
- 直接サブクラスの親インスタンスのインスタンスに割り当てることができます(コードを書く時にはそのことを考えていません)
Pet pet;
Dog dog;
Pet *pPet=&dog;
*pPet=pet; //赋值成功