【C++语言实现】【本科实验系列】车辆基本信息管理问题场景描述如下:为了对车辆基本信息进行管理,对现实世界车辆基本信息抽象后,抽象出Car类,ElectricCar类,Battery类,它们之间的关系描述如下:基于Car类派生出ElectricCar类,派生类ElectricCar中新增数据成员为Battery类对象。
前言介绍实验目的(很官方很学校化地介绍)实验内容实验大体内容基于以下描述设计并实现Car类要求Car类提供成员函数实现以下要求基于以下描述设计并实现ElectricCar类
代码实现(注释写的很详细)总结
前言介绍
本人脚还没有完全康复,又在家写程序了,这个系列的文章打算周更,现在是每周二更新
实验目的(很官方很学校化地介绍)
理解类的继承和派生机制
掌握派生类的定义和使用
理解和掌握派生类成员的标识和访问中同名覆盖原则、二元作用域分辨符和虚基类的用法
掌握派生类构造函数和析构函数的定义及调用次序
理解运算符重载的目的,掌握运算符重载函数的编写方法
实验内容
实验大体内容
车辆基本信息管理问题场景描述如下:为了对车辆基本信息进行管理,对现实世界车辆基本信息抽象后,抽象出Car类,ElectricCar类,Battery类,它们之间的关系描述如下:基于Car类派生出ElectricCar类,派生类ElectricCar中新增数据成员为Battery类对象。
每个Battery类对象有如下信息: 车载动力电池容量(batterySize)要求Battery类提供成员函数实现以下要求: 带有默认形参值的构造函数。 实现Battery类对象的构造,在构造对象时对电池容量BatterySize进行初始化,默认参数值为70(单位:kWh)返回当前电池容量。
基于以下描述设计并实现Car类
每辆汽车有如下信息: 制造商(maker),型号(model),生产年份(year),行车里程数(odometer)。
要求Car类提供成员函数实现以下要求
①带参数的构造函数。实现Car类对象的构造,并在构造对象时实现对制造商、型号、生产年份的初始化。初始构造时,行车里程数总是0。
②重载运算符<<为Car类友元。实现车辆信息显示输出,输出信息包括:制造商、型号、生产年份、当前行车里程数。
③更新行车里程数。更新后的行车里程数通过参数传递。要求能对参数进行合理性检验,如果更新后的行车里程数值小于当前行车里程数,打印警告信息,提示更新数值有误。
基于以下描述设计并实现ElectricCar类
①ElectricCar类继承自Car类,新增数据成员电池(battery)。其中battery是Battery类对象。
②带参数的构造函数实现ElectricCar类对象的构造,并在构造时实现对制造商、型号、生产年份以及新增数据成员电池的初始化。初始构造时,行车里程数总是0。
③重载运算符<<为ElectricCar类友元。实现车辆信息显示输出,包括:制造商、型号、生产年份、当前行车里程数、当前电池容量。
代码实现(注释写的很详细)
#include<iostream>
#include<string>
using namespace std
;
class Car
{
private
:
string maker
;
string model
;
int year
;
int odometer
;
public
:
Car();
int Get_Odometer();
string
Get_maker();
string
Get_model();
int Get_year();
void Update_Odometer(int input_odometer
);
void Set_maker(string
& in_maker
);
void Set_model(string
& in_model
);
void Set_year(int in_year
);
void Set_odometer(int in_odometer
);
};
class ElectricCar
:public Car
{
public
:
class Battery
{
private
:
double BatterySize
;
public
:
Battery(double in_BatterySize
= 70)
{
this
->BatterySize
= in_BatterySize
;
}
double Get_BatterySize()
{
return this
->BatterySize
;
};
void Set_BatterySize(double in_B
)
{
this
->BatterySize
= in_B
;
}
};
ElectricCar():battery(70){};
ElectricCar(string in_maker
,string in_model
,int in_year
,int in_odometer
,double in_B_size
);
friend ostream
& operator
<< (ostream
& output
,Car
& c
);
Battery battery
;
};
string Car
::Get_maker()
{
return this
->maker
;
}
string Car
::Get_model()
{
return this
->model
;
}
int Car
::Get_year()
{
return this
->year
;
}
ostream
& operator
<< (ostream
& output
,ElectricCar
& c
)
{
output
<<"制造商:"<<c
.Get_maker()<<"\n"<<"型号:"<<c
.Get_model()<<"\n"<<"生产年份:"<<c
.Get_year()<<"\n"<<"当前行车里程数:"<<c
.Get_Odometer()<<"\n"<<"当前电池容量:"<<c
.battery
.Get_BatterySize()<<"kWh"<<endl
;
return output
;
}
Car
::Car()
{
this
->odometer
= 0;
this
->year
= 2019;
}
int Car
::Get_Odometer()
{
return this
->odometer
;
}
void Car
::Update_Odometer(int input_odometer
)
{
if(Get_Odometer()>input_odometer
)
{
cout
<<"您输入的里程数数据不合法\n更新数值有误!"<<endl
;
}
else
{
this
->odometer
= input_odometer
;
}
}
void Car
::Set_maker(string
& in_maker
)
{
this
->maker
= in_maker
;
}
void Car
::Set_model(string
& in_model
)
{
this
->model
= in_model
;
}
void Car
::Set_year(int in_year
)
{
this
->year
= in_year
;
}
void Car
::Set_odometer(int in_odometer
)
{
Update_Odometer(in_odometer
);
}
ElectricCar
::ElectricCar(string in_maker
,string in_model
,int in_year
,int in_odometer
,double in_B_size
)
{
Car
::Set_maker(in_maker
);
Car
::Set_model(in_model
);
Car
::Set_year(in_year
);
Car
::Set_odometer(in_odometer
);
battery
.Set_BatterySize(in_B_size
);
}
int main()
{
ElectricCar
Test1("这里是制造商","这里是型号",2019,1,99);
cout
<<Test1
;
return 0;
}
总结
首先是Battery类是内部类一定要定义好然后就是在coding过程中出现了一个尴尬地问题,把行车里程数和年份要初始化的值写反了,导致后面接二连三地BUG,这点要注意这个程序挺难的,逻辑关系要找好,不过相较于之前的,这个还算简单