【C++语言实现】【本科实验系列】车辆基本信息管理问题场景描述如下:为了对车辆基本信息进行管理,对现实世界车辆基本信息抽象后,抽象出Car类,ElectricCar类,Battery类,它们之间的关系

    xiaoxiao2021-04-15  389

    【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; //Car类 class Car { private: string maker;//制造商 string model;//型号 int year;//生产年份 int odometer;//行车里程数 public: Car();//构造函数声明 int Get_Odometer();//Get行车里程数方法声明 string Get_maker();//Get制造商方法声明 string Get_model();//Get型号方法声明 int Get_year();//Get生产年份方法声明 void Update_Odometer(int input_odometer);//更新行车里程数方法声明 void Set_maker(string& in_maker);//Set制造商方法声明 void Set_model(string& in_model);//Set型号方法声明 void Set_year(int in_year);//Set生产年份方法声明 void Set_odometer(int in_odometer);//Set行车里程数方法声明 }; //Car派生ElectricCar类 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; };//Get电池容量 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;//Battery类对象 }; string Car::Get_maker() { return this->maker; } //Get型号方法实现 string Car::Get_model() { return this->model; } //Get生产年份方法实现 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; } /*实现对制造商、型号、生产年份的初始化。 初始构造时,行车里程数总是0。*/ Car::Car() { this->odometer = 0; this->year = 2019; } //Get行车里程数方法实现 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; } } //Set制造商方法实现 void Car::Set_maker(string& in_maker) { this->maker = in_maker; } //Set型号方法实现 void Car::Set_model(string& in_model) { this->model = in_model; } //Set生产年份方法实现 void Car::Set_year(int in_year) { this->year = in_year; } //Set行车里程数方法实现 void Car::Set_odometer(int in_odometer) { Update_Odometer(in_odometer); } //带参数构造函数构造ElectricCar类对象 //构造时实现对制造商、型号、生产年份以及新增数据成员电池的初始化 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,这点要注意这个程序挺难的,逻辑关系要找好,不过相较于之前的,这个还算简单

    最新回复(0)