Part 1 车辆基本信息管理

1、代码

 #include<iostream>
using namespace std; #include"car.h"
#include "ElectricCar.h"
#include "Battery.h"
int main()
{
Car oldcar("Audi", "a4", );
cout << "--------oldcar's info--------" << endl;
oldcar.updateodometer();
cout << oldcar << endl;
oldcar.updateodometer();//测试出错情况
cout << oldcar << endl; ElectricCar newcar("Tesla", "model s", );
newcar.updateodometer();
cout << "\n--------newcar's info--------\n";
cout << newcar << endl;
system("pause");
return ;
}

mian.cpp

 #pragma once
#include "Car.h"
#include"Battery.h"
#include<iostream>
using namespace std;
class Battery;//友元类的声明
class ElectricCar:public Car
{
public:
ElectricCar(string ker = "producer", string mod = "A1", int y = , double s = );
friend ostream & operator<<(ostream &out, ElectricCar &e);
~ElectricCar(); private:
Battery b;
int a;//b.battery的值的副本存储
};

ElectricCar.h

 #include "ElectricCar.h"
using namespace std; ElectricCar::ElectricCar(string ker, string mod, int y, double s):Car(ker,mod,y,s)//构造函数
{
b.batterysize = ;//初始化Battery中的私有成员的值
a = b.batterysize;
} ostream & operator<<(ostream &out,ElectricCar &e)
{
out << "maker:" << e.getker() << "\n" << "model:" << e.getmod() << "\n" << "year:" << e.gety() << "\n" << "odometer:" << e.gets()<<"\n"<<"batterysize:"<< e.a<<"-kWh"<< endl;
return out;
} ElectricCar::~ElectricCar()
{
}

ElectricCar.cpp

 #pragma once
class Battery
{
public:
Battery(int basize=);
~Battery();
friend class ElectricCar;//声明为友元类
private:
int batterysize;
};

Battery.h

 #include "Battery.h"

 Battery::Battery(int basize):batterysize(basize)
{
} Battery::~Battery()
{
}

Battery.cpp

 #pragma once
#include<string>
#include<iostream>
using std::string;
using std::cout;
using std::cin;
using std::ostream; class Car
{
public:
Car(string ker="producer",string mod="A1",int y=,double s= );
~Car();
friend ostream & operator<<(ostream &out,Car &c);
void updateodometer(double s);
string getker() { return maker; }
string getmod() { return model; }
int gety() { return year; }
double gets() { return odo; }
private:
string maker;
string model;
int year;
double odo;
};

Car.h

 #include "Car.h"
using namespace std; //构造函数
Car::Car(string ker,string mod,int y,double s ):maker(ker),model(mod),year(y),odo(s)
{
} void Car::updateodometer(double s)
{
double ss = odo;
odo = s;
if (s < ss)
{
cout << "Warn! Update is wrong.Please input again:";
cin >> s;
updateodometer(s);
}
} //<<运算符重载
ostream & operator<<(ostream &out,Car &c)
{
out <<"maker:" << c.maker << "\n"<< "model:" << c.model << "\n"<< "year:" << c.year << "\n"<< "odometer:" << c.odo << endl;
return out;
}

Car.cpp

2、程序结果截图

3、相关说明

(1)题目是Battery类作为派生类ElectricCar的新增成员数据要求返回Battery类中私有成员的值,不知道咋实现。所以我

①将类ElectriCar声明为了Battery的友元类,以此在E类中访问B类中的私有成员。详情见Battery.h中的第7行和ElectricCar.h中的第6(友元类声明),15行。(应该也可以用组合类的方式)

②E类 中还有另一个私有数据成员int a,是b.battery的值的副本,为了直接在operator<<中直接使用e.a调用b.battery的值(因为期间出现的各种各样的问题)。详情见E.h的第16行和E.cpp的第7,12行。

(2)在main.cpp中新增两行代码第13,14行,并更改原更新里程数使其故意变小,测试如果新增里程数小于之前时的警告信息弹出问题。有警告,可以修改。

4、错误及漏洞

(1)重载<<中的问题:

①错误写法:{out<<```<<endl;  out<<```<<endl;  return out;}

结果:出现死循环。报错:operator<<”: 如递归所有控件路径,函数将导致运行时堆栈溢出。查资料得“堆栈溢出”通常出现在 在函数体内反复调用自己 的情况下。应out输出为一句话,其中的换行应用换行符来完成——"\n"。

(在查找资料的时候也发现另一个类似的问题,即“operator>>”: 如递归所有控件路径,函数将导致运行时堆栈溢出。 对应输入时的>>运算符,需要往对象里输入数据,不能向一个const引用的对象里输入,即应该删去const。)

②ostream是个定义了输出流的类,在<<操作重载中,作为友元函数出现。需要using std::ostream;(称为通过使用using关键字来使用c++标准程序库的标识符,using namespace std;所有标识符都有效。其中常见也包括endl,string等等。)

(2)派生类怎么调用私有成员。当基类声明为public时,私有成员仍然是私有,类外部不能直接访问.需要在基类的公有成员设置接口,即返回私有成员值的公有函数接口。string getmaker(){return maker;} 。见car.h中的16-19行。 派生类对象名.getmaker() 调用私有成员maker 见ElectricCar.cpp中的第12行

(3)分文件编写,友元函数要有声明,如果没有声明则有错误提示:不允许使用不完整类型。A类(ElectricCar类)想直接调用B类(Battery类)私有成员,则在B类中定义friendA。(不要混了)

(4)在派生类中初始化基类对象。调用基类的构造函数。“构造函数名(赋值)”也即“基类名(赋值)”。见ElectricCar.cpp中的第四行。

(5)另外注意的小问题:①带默认形参值的参数与不带的参数的位置顺序。②构造函数中是形参给私有成员赋值,即 私有成员(形参)。③类的成员函数如果有默认形参值,必须写在类的定义中

Part 2重载运算符[]

1、代码

 #include <iostream>
using namespace std; #include "arrayInt.h" int main() {
// 定义动态整型数组对象a,包含2个元素,初始值为0
ArrayInt a();
a.print(); // 定义动态整型数组对象b,包含3个元素,初始值为6
ArrayInt b(, );
b.print(); // 通过对象名和下标方式访问并修改对象元素
b[] = ;
cout << b[] << endl;
b.print(); system("pause"); return ;
}

main.cpp

(突然蹦出空行,不知道怎么删除)

 #ifndef ARRAY_INT_H
#define ARRAY_INT_H class ArrayInt{
public:
ArrayInt(int n, int value=);
~ArrayInt();
int & operator[](int a);// 补足:将运算符[]重载为成员函数的声明
// ×××
void print();
private:
int *p;
int size;
}; #endif

ArrayInt.h

 #include "arrayInt.h"
#include <iostream>
#include <cstdlib>
using std::cout;
using std::endl; ArrayInt::ArrayInt(int n, int value): size(n) {
p = new int[size]; if (p == nullptr) {
cout << "fail to mallocate memory" << endl;
exit();
} for(int i=; i<size; i++)
p[i] = value;
} ArrayInt::~ArrayInt() {
delete[] p;
} void ArrayInt::print() {
for(int i=; i<size; i++)
cout << p[i] << " ";
cout << endl;
} // 补足:将运算符[]重载为成员函数的实现
// ×××
int & ArrayInt::operator[](int a)
{
return p[a];
}

ArrayInt.cpp

2、程序结果

3、有关过程

(1)理解是干什么的:ArrayInt类的对象,有两个参数n(数组大小),和value(数组元素赋的值),构造动态整形数组。并能够通过“对象名[i]”的形式访问该数组的第i+1个元素。

(2)错误编写一:声明:ArrayInt operator[](const ArrayInt &c,int a);

函数实现:{return p[a];}

①[]是单目运算符,且主函数调用的形式是“对象名[整形数]”

②调试报错:main.cpp第17行cout << b[0] << endl;没有与ArrayInt类型相匹配的<<运算符

错误编写二:声明:int operator[](int a);

函数实现:{return p[a];}

①调试报错:main.cpp第16行b[0] = 2;表达式必须为可修改的左值。即返回了常量,但是需要变量。

(3)综上:返回值的类型是个整形变量。翻书才发现上课老师讲过,即“int & operator运算符()”的形式,它返回引用类型。(为了能写在等号左边)

总结:

一股脑看完题会很难受,但其实从一点儿一点儿编起,一块一块的完成,最后还是挺有成就感。

不知道时常依赖VS中红色波浪线好不好,是不是错过了很多问题。

第一遍完成和后来完善,每次看程序查书的感觉都不一样,不断觉着之前苦思的都是傻问题或突然领悟或上课本来就讲过。

此次实验比较满意的是在编写过程中建立了文档专门记录自己各种各样的问题,遇到即记下来,所以可能此次每块的总结会细一些,想以后复习应该也有很大帮助。

互评网址:

1、

c++第四次实验2的更多相关文章

  1. 20145224&20145238 《信息安全系统设计基础》 第四次实验

    20145224&20145238 <信息安全系统设计基础>第四次实验 课程:信息安全系统设计基础 班级:1452 姓名:陈颢文 荆玉茗 学号:20145224 20145238 ...

  2. 20145330《Java程序设计》第四次实验报告

    20145330<Java程序设计>第四次实验报告 实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建A ...

  3. 20145320《Java程序设计》第四次实验报告

    20145320<Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.04.26 15: ...

  4. 南京邮电大学java第四次实验报告

    实 验 报 告 ( 2017 / 2018学年 第2学期) 课程名称 JAVA语言程序设计 实验名称 Java集成开发环境的安装与使用. Java变量.表达式与控制结构 实验时间 2018 年 6 月 ...

  5. 20155323 第四次实验 Android程序设计实验报告

    20155323 第四次实验 Android程序设计实验报告 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: ...

  6. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  7. 20145238-荆玉茗 《Java程序设计》第四次实验报告

    20145238<Java程序设计>第四次实验报告 实验四 Android环境搭建 实验内容 1.搭建Android环境 2.运行Android 3.修改代码,能输出学号 实验步骤 搭建A ...

  8. 第六周学习总结&第四次实验报告

    第六周学习总结&第四次实验报告 学习总结 这周我们简单的学习了一点点关于接口的内容,接口是Java中最重要的概念之一,接口可以理解为一个特殊的类, 里面由全局常量和公共的抽象方法组成,接口摆脱 ...

  9. C语言第四次实验报告

    第四次实验报告 一·实验项目名称: 多球反弹 二·实验项目功能描述: (1)实现多个小球 (2)实现多个小球碰壁会反弹 (3)实现小球之间碰撞反弹 三· 项目模块结构介绍 #define High 4 ...

  10. Java实验四和实验五

    实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了 ...

随机推荐

  1. 关于数组的初始化memset函数

    关于数组的初始化memset函数 其实memset复制时按bit8个8个的赋值,有兴趣的可以自己百度.

  2. 十七 Django框架,文件上传

    1.自定义上传[推荐] 请求对象.FILES.get()获取上传文件的对象上传对象.name获取上传文件名称上传对象.chunks()获取上传数据包,字节码类型 html <!DOCTYPE h ...

  3. java后端书单

    Java开发工程师一般负责后端开发,当然也有专门做Java Web的工程师,但是随着前后端的分离,越来越多的Java工程师需要往大后端方向发展. 今天我们就来介绍一下Java后端开发者的书单. 首先要 ...

  4. vuex使用mapActions报错解决办法

    先贴上报错: vuex2增加了mapGetters和mapActions的方法,借助stage2的Object Rest Operator 所在通过 methods:{ ...mapActions([ ...

  5. 素数环:NYOJ--488--dfs||hdu-1016-Prime Ring Problem

    /* Name: NYOJ--488--素数环 Author: shen_渊 Date: 15/04/17 15:30 Description: DFS,素数打个表,37以内就够用了 */ #incl ...

  6. hdu--2111--Saving HDU(贪心)

    #include<iostream> #include<vector> #include<algorithm> using namespace std; struc ...

  7. IOS 实现banner循环轮播

    在项目中把banner图片UIImageView一张一张的放入UIScrollView中,通过设置UIScrollView的pagingEnabled属性为YES,则可以做到当用户滑动banner时图 ...

  8. Arc066_E Addition and Subtraction Hard

    传送门 题目大意 给定一个加减法的表达式,让你任意的添加合法的括号对,使的表达式最大. 题解 考虑到任意左括号一定加在减号右边,那么对于第一个左括号,与该左括号相邻的只含有加号的子序列的贡献一定为负, ...

  9. Java的native关键字

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...

  10. n文件的上传和下载,struts2和springmvc

    首先,struts2的上传下载的配置 因为struts2是配置的上传的拦截器,很简单的步揍就可以上传, 首先是配置struts的action映射 <!-- 4. 修改上传文件的最大大小为30M ...