给出适当的类设计和相应的代码: 有一个只能放进不能取出的盒子, 最多可放8个水果, 不一定一天放入。水果只是苹果和桔子两种, 它们放入盒子前的原始重量分别为50和30, 放入盒子后, 由于丢失水分, 它们的重量减轻, 苹果和桔子每天分别减轻4和3, 直到达到各自原始重量的3/5后, 不再减轻重量。盒子的功能有: 输出盒子中苹果的数量; 输出盒子中桔子的数量; 输出一天来盒子中水果减轻的总重量; 输出当前水果的总重量。
实现代码:
class Fruit
{
public:
Fruit(int mMax =0,int mMin=0,int mLose = 0,int mW = 0)
:mMaxWeight(mMax),mMinWeight(mMin),mLoseWeight(mLose),mWeigth(mW) {}
virtual ~Fruit() {}
virtual Fruit * Clone( ) const = 0;
virtual int ReduceWeight( );
virtual int Weight( ) const;
protected:
int mMaxWeight;
int mMinWeight;
int mLoseWeight;
int mWeight;
};
int Fruit::ReduceWeight( )
{
int newWeight = mWeight - mLoseWeight;
if (newWeight < mMinWeight )
newWeight = mMinWeight;
int reduce = mWeight - newWeight;
mWeight = newWeight;
return reduce;
}
int Fruit::Weight( ) const
{
return mWeight;
}
class Apple:public Fruit
{
public:
Apple():Fruit(50,50*3/5,4,50) { }
virtual ~Apple( ) {}
virtual Apple * Clone() const
{ return new Apple(*this); }
// other
};
class Orange:public Fruit
{
public:
Orange():Fruit(30,30*3/5,3,30) { }
virtual ~Orange( ) {}
virtual Orange * Clone() const
{ return new Orange(*this); }
// other
};
class Box
{
public:
Box():count(0) {for(int i=0;i<8;i++) fruit[i]=0;}
~Box() {for(int i=0;i<8;i++) delete fruit[i];}
void AddFruit(Fruit& one) //放入一个水果
{
if (count<8)
fruit[count++]=one.Clone();
}
int ApplesNum() const
{
int num=0;
for(int i=0;i<8;i++) {
Apple * p=dynamic_cast<Apple *>(fruit[i]);
if (p)
++num;
}
return num;
}
int OrangesNum() const
{
int num=0;
for(int i=0;i<8;i++) {
Orange * p=dynamic_cast<Orange *>(fruit[i]);
if(p)
++num;
}
return num;
}
int PassOneDay() //一天来失去的总重量
{
int num=0;
for(int i=0;i<8;i++)
if(fruit[i])
num+=fruit[i]->ReduceWeight();
return num;
}
int TotalWeight() const
{
int num=0;
for(int i=0;i<8;i++)
if(fruit[i])
num+=fruit[i]->Weight();
return num;
}
void Show() const
{
cout<<"盒子里共有苹果 ="<<ApplesNum()<<endl;
cout<<"盒子里共有桔子 ="<<OrangesNum()<<endl;
cout<<"一天来共失去重量="<<PassOneDay()<<endl;
cout<<"当前水果的总重量="<<TotalWeight()<<endl;
cout<<endl;
}
private:
Fruit * fruit[8];
int count;
};
int main(int argc, char* argv[])
{
Box aBox;
Apple a1,a2,a3;
cout<<"第一天放入一个苹果"<<endl;
aBox.AddFruit(a1);
aBox.Show();
cout<<"第二天又放入一个苹果"<<endl;
aBox.AddFruit(a2);
aBox.Show();
Orange o1,o2;
cout<<"第三天又放入两个桔子"<<endl;
aBox.AddFruit(o1);
aBox.AddFruit(o2);
aBox.Show();
cout<<"第四天又放入一个苹果"<<endl;
aBox.AddFruit(a3);
aBox.Show();
return 0;
}