记录开发简单职工管理系统遇到的一些问题,黑马教程

https://www.bilibili.com/video/BV1et411b73Z P147 ~ P166

头文件与源文件

  • 头文件只声明,源文件来实现(本质上是类内声明类外实现)
  • 源文件需要引用特定的头文件
ifndef OOPFINAL_WORKER_H
#define OOPFINAL_WORKER_H #include <iostream>
#include <string> using namespace std; class Worker {
public:
virtual void ShowInfo() = 0; virtual string getDeptName() = 0; int m_Id;
string m_Name;
int m_DeptId;
}; #endif //OOPFINAL_WORKER_H
#ifndef OOPFINAL_MANAGER_H
#define OOPFINAL_MANAGER_H #include <bits/stdc++.h>
#include "Worker.h" using namespace std; class Manager : public Worker {
public:
Manager(int id, string name, int dId); void ShowInfo() override; string getDeptName() override;
}; #endif //OOPFINAL_MANAGER_H
#include "../headers/Manager.h"

void Manager::ShowInfo() {
cout << "职工编号 " << m_Id << "\t职工姓名 "
<< m_Name << "\t岗位 " << getDeptName() << "\t岗位职责:完成老板交给的任务,并下发任务给普通员工" << endl;
} string Manager::getDeptName() {
return "经理";
} Manager::Manager(int id, string name, int dId) {
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = dId;
}

头文件重复引用

#ifndef,#define,#endif

#ifndef 的方式依赖于宏名字不能冲突(最好采用这种方式

  • 保证同一个文件只会被编译一次
  • 内容完全相同的两个文件只会编译其中一个一次

#pragma once

同一个文件不会被编译多次(物理上的同一个文件,不是指内容相同的两个文件)

要求整数却输入字符

这种情况下会标志位 failbit 被置 1,字符一直在缓冲区中,没被读出,可能出现死循环

  • cin.restate() 当cin.rdstate()返回 0 (即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作

  • cin.fail() 可以判断流操作是否失败,输入错误后,cin.fail()返回为真 错误流标志位被置failbit为true, 当恢复时 failbit被设置为false

  • cin.clear() (默认为0 ,即无错误)清除错误的标志位

    clear有多种状态

    • goodbit 无错误
    • Eofbit 已到达文件尾
    • failbit 非致命的输入/输出错误,可挽回
    • badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号
    • 通过设置cin.clear() 或 cin.clear(istream::goodbit)清除错误状态
  • cin.ignore() 清除缓冲区

如果输入错误,通过cin.clear()清除了错误状态标志后,下一次cin输入时,仍会从缓冲区中读取数据,而之前的错误输入此时仍存在缓冲区中,所以还会再次被读取造成错误,所以要清空缓冲区

  • cin.ignore(要清除的字节长度,标识)

cin.ignore(1024,’\n’)

该函数就是将选中的字节取出抛弃掉(cin操作时是以char为单位的)

标识清除的最大长度是1024个字节。

清除时如果遇到‘\n’就停止,不管是否是1024个字节。

如果没有遇到‘\n’就只清除1024个

cin.ignore()的默认参数为cin.ignore(1,EOF),及清除文件描述符前一个字节

cout << "输入选择" << endl;
while (cin >> choice, cin.fail()) {
cout << "输入有误,请重新输入" << endl;
cin.clear(); // 清除错误标志位
cin.ignore(); // 清除缓冲区
}

Delete[]

在09讲,添加职工函数中,老师释放了数组空间,但没释放数组元素的空间,为什么?

  • 依旧需要原来的数组元素,在释放数组前执行了原有元素地址的拷贝
  • 新数组 = 旧数组元素 + 新添加的数组元素

以下旨在探究 Delete 数组,会不会调用数组元素的析构器

答案是不会,需要自己手动调用

#include <iostream>

using namespace std;

class Father {
public:
Father() = default; virtual ~Father() {
cout << "父元素析构器" << endl;
}; }; class Son1 : public Father {
public:
~Son1() {
cout << "一号子类析构器" << endl;
}
}; class Son2 : public Father {
public:
~Son2() {
cout << "二号子类析构器" << endl;
}
}; int main() {
Father **array = new Father *[10];
array[0] = new Son1();
array[1] = new Son2();
array[2] = new Son2();
// delete array[0];
// delete array[1];
// delete array[2];
delete[] array; cout << "---------" << endl;
Father *test = new Son1();
delete test;
return 0;
}

文件存在且数据为空

  • 判断文件是否被打开
  • 读入一个字符,判断字符是不是文件尾部标志

ifs.eof() 判断是要在读取到文件结束符之后才会置为true,意思也就是说即使打开一个空文件,你不读取里面的数据,ifs.eof() 会默认置为false

peek() 尝试读取第一个字符,但不提取(光标位不后移)

//  char ch;
// ifs >> ch;
ifs.peek();
if (ifs.eof()) {
// 文件为空
cout << "文件为空" << endl;
m_EmpArray = NULL;
m_EmpNum = 0;
this->m_FileIsEmpty = true;
ifs.close();
return;
}

ifstream 回到文件头

使用 ifstream 进行文本文件读取时,如果读指针位于文件末尾,无法直接通过调用seekg(0, ios::beg) 回到文件开头,而是需要先调用 clear() 清除指针状态,再调用seekg(0, ios::beg) 才能成功返回文件头

  • ios::beg 默认的,从流的开头开始定位
  • ios::cur 从流的当前位置开始定位
  • ios::end 从流的末尾开始定位

override

override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。

=default

=default 是C++11引入的一种特性,它允许显式要求编译器生成默认的特殊成员函数。特殊成员函数包括默认构造函数、复制构造函数、移动构造函数、复制赋值运算符、移动赋值运算符以及析构函数

参考资料

cplusplus.com/reference/istream/istream/seekg/

Set Position with seekg() in C++ File Handling - GeeksforGeeks

cin输入的类型不匹配造成的死循环CSDN博客

C++-关键字:override(重写)

【#ifndef, #define, 和 #endif】

c++新特性:=default - 知乎 (zhihu.com)

C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题的更多相关文章

  1. C++ GUI Qt4学习笔记01

    C++ GUI Qt4学习笔记01   qtc++signalmakefile文档平台 这一章介绍了如何把基本的C++只是与Qt所提供的功能组合起来创建一些简单的图形用户界面应用程序. 引入两个重要概 ...

  2. 软件测试之loadrunner学习笔记-01事务

    loadrunner学习笔记-01事务<转载至网络> 事务又称为Transaction,事务是一个点为了衡量某个action的性能,需要在开始和结束位置插入一个范围,定义这样一个事务. 作 ...

  3. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  4. Spring MVC 学习笔记9 —— 实现简单的用户管理(4)用户登录显示局部异常信息

    Spring MVC 学习笔记9 -- 实现简单的用户管理(4.2)用户登录--显示局部异常信息 第二部分:显示局部异常信息,而不是500错误页 1. 写一个方法,把UserException传进来. ...

  5. Spring MVC 学习笔记8 —— 实现简单的用户管理(4)用户登录

    Spring MVC 学习笔记8 -- 实现简单的用户管理(4)用户登录 增删改查,login 1. login.jsp,写在外面,及跟WEB-INF同一级目录,如:ls Webcontent; &g ...

  6. Django:学习笔记(1)——开发环境配置

    Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...

  7. SaToken学习笔记-01

    SaToken学习笔记-01 SaToken版本为1.18 如果有排版方面的错误,请查看:传送门 springboot集成 根据官网步骤maven导入依赖 <dependency> < ...

  8. Redis:学习笔记-01

    Redis:学习笔记-01 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 1. Redis入门 2.1 ...

  9. Spring MVC 学习笔记10 —— 实现简单的用户管理(4.3)用户登录显示全局异常信息

    </pre>Spring MVC 学习笔记10 -- 实现简单的用户管理(4.3)用户登录--显示全局异常信息<p></p><p></p>& ...

  10. Android:日常学习笔记(8)———开发微信聊天界面

    Android:日常学习笔记(8)———开发微信聊天界面 只做Nine-Patch图片 Nine-Patch是一种被特殊处理过的PNG图片,能够指定哪些区域可以被拉升,哪些区域不可以.

随机推荐

  1. DB事物

    1.事物概念:一组逻辑操作单元 始数据从一种状态变换到另一种状态事物处理:所有事物 都作为一个工作单元来执行 , 即使出现了故障 都不能改变这种执行方式, commint提交之后 这些修改就永久的保存 ...

  2. 让你的代码动起来:Python进度条神器tqdm详解及应用实例

    各位Python高手,今天我要给大家介绍一个好用的库,它就是:tqdm tqdm在阿拉伯语中的意思是 "进展",所以这个库也被称为 "快速进展条".不得不说,这 ...

  3. 20个Golang片段让我不再健忘

    前言 本文使用代码片段的形式来解释在 go 语言开发中经常遇到的小功能点,由于本人主要使用 java 开发,因此会与其作比较,希望对大家有所帮助. 1. hello world 新手村的第一课,毋庸置 ...

  4. Java中的金钱陷阱

    前言 有多少小伙伴是被标题 骗 吸引进来的呢,我可不是标题党,今天的文章呢确实跟"金钱"有关系. 但是我们说的不是过度追求金钱而掉入陷阱,而是要说一说在Java程序中,各种跟金钱运 ...

  5. .NET Core(C#)使用Titanium.Web.Proxy实现Http(s)代理服务器监控HTTP请求

    关于Titanium.Web.Proxy详细信息可以去这里仔细看看,这里只记录简单用法 安装引用Titanium.Web.Proxy NuGet直接获取Titanium.Web.Proxy 使用 配置 ...

  6. 前端vue可以左右滚动的切换的tabs tabs选项卡 滑动动画效果 自动宽度

    前端vue可以左右滚动的切换的tabs tabs选项卡 滑动动画效果 自动宽度, 下载完整代码请访问https://ext.dcloud.net.cn/plugin?id=13003 效果图如下:   ...

  7. 05-面试必会-SpringBoot&SpringCloud

    01- 讲一讲 SpringBoot 自动装配的原理 1.在 SpringBoot 项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解 ...

  8. React学习时,outlet配置(token判定,页面path监听)

    尽管写过 outlet 路由的配置. 考虑到 token 判定和 路由页 变更,我不了解v6是不是有更详解的做法. 决定调一下配置,期望 在任何页面异步更新时,token 都可以在跳转前 被检测到,防 ...

  9. 如何开发 RESTful、GraphQL 和 SOAP 等不同类型的 API ?

    在软件开发中,API(应用程序编程接口)的重要性不言而喻.API已成为不可或缺的构建模块,使开发人员能够创建功能丰富.多样化和可扩展的应用程序.这是一篇综合指南,旨在深入探讨API开发,使初学者和有经 ...

  10. 瞬间抠图!揭秘 ZEGO 绿幕抠图算法背后的技术

    抠图是图像处理中最常见的操作之一,指的是将图像中需要的部分从画面中精确的提取出来. 抠图的主要功能是为了后期的合成做准备.在 Photoshop 中,抠图的方法有很多种,最常见的有通道抠图.蒙版抠图. ...