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

这篇具有很好参考价值的文章主要介绍了C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录开发简单职工管理系统遇到的一些问题,黑马教程
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)文章来源地址https://www.toymoban.com/news/detail-709822.html

到了这里,关于C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • C++学习笔记(七)——学生信息管理系统

    C++学习笔记(七)——学生信息管理系统

    前言 大致功能概况 具体代码实现 登录学生系统模块 创建学生信息模块 显示学生信息模块 保存学生信息模块 读取学生信息模块 增添学生信息模块 删除学生信息模块 查找学生信息模块 修改学生信息模块 插入学生信息模块 学生成绩排序模块 前面已经学了C++的类和对象,对

    2024年02月11日
    浏览(11)
  • 程序设计职工管理系统

    程序设计职工管理系统

    本系统要求用 C 语言建立 一个职工信息管理系统 ,本职工信息管理系统可以实现对众多员工信息 的管理 。 包含 对 职工信息 进行 添加 、 查询 、 删除 、修改 。 1.2 系统的界面要求  按任意键便可以进入主菜单,在主菜单上显示出 该系统 的功能,通过输入数字 0 到 6  来

    2024年02月08日
    浏览(8)
  • 职工信息管理系统(C语言)

    职工信息管理系统(C语言)

    目录 1.前言 2.实现功能 3.流程图  4.源码 5.总结         距学习C语言已经相当长的一段时间了,编写一个小项目,功能实现可能不是很完美,算是复习和记录吧! 0.录入职工信息                      1.按工资高低排序 2.修改职工信息 3.显示职工信息 4.删除职工信息 5.查询

    2024年02月11日
    浏览(9)
  • c++学习笔记-STL案例-机房预约系统4-管理员模块

    c++学习笔记-STL案例-机房预约系统4-管理员模块

    前言 衔接上一篇“c++学习笔记-STL案例-机房预约系统3-登录模块”,本文主要设计管理员模块,从管理员登录和注销、添加账号、显示账号、查看机房、清空预约五个功能进行分析和实现。 目录 7 管理员模块 7.1 管理员登录和注销 7.1.1 构造函数 ​编辑7.1.2 管理员子菜单 7.1.

    2024年01月19日
    浏览(10)
  • C语言课程设计_职工工资管理系统

    C语言课程设计_职工工资管理系统

    设计一个职工工资管理系统: (1)输入记录:将每一个职工的姓名、ID号以及基本工资、职务工资、岗位津贴、医疗保险、公积金的数据作为一个记录。该软件能建立一个新的数据文件或给已建立好的数据文件增加记录。 (2)显示记录:根据用户提供的记录或者根据职工姓名

    2024年02月10日
    浏览(8)
  • 37基于java的职工管理系统设计与实现

    本章节给大家带来一个基于java的职工管理系统设计与实现,可适用于员工管理系统,企业员工管理系统,公司员工管理系统,企业人事管理系统,基于java职工管理系统,前后端分离,员工考勤管理系统,职工奖惩管理系统,职员合同管理,HR管理系统,人事HR管理系统等;

    2024年02月05日
    浏览(5)
  • 数据结构C/C++ 职工信息管理系统

    数据结构C/C++ 职工信息管理系统

    数据结构C/C++ 职工信息管理系统 一、前言 二、系统结构设计 三、模块功能代码 3.1 菜单函数 3.2 初始化单链表 3.3 添加信息 3.4 信息输出 3.5 信息排序 3.6 信息删除 3.7 信息存储 四、系统完整代码 五、运行结果(部分展示) 六、实验总结 七、参考网址 本文还是使用较老的

    2024年01月16日
    浏览(9)
  • QT5实现职工工资信息管理系统(文件读写)

    QT5实现职工工资信息管理系统(文件读写)

    暑期学校QT实践项目 该系统需创建和管理如下信息:1、职工信息:工号、姓名、年龄、入职日期、电话、住址、月工资数据集。2、月工资信息:月份、基本工资、岗位工资、工龄工资、津贴、岗贴、补贴、房贴、交通补贴。 系统功能要求如下: 1.创建和管理职工信息的对

    2024年02月09日
    浏览(7)
  • 黑马程序员-职工管理系统实战-附加源码Git

    黑马程序员-职工管理系统实战-附加源码Git

    职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责:完成经理交给的任务 经理职责:完成老

    2024年02月03日
    浏览(15)
  • 第01篇:系统化学习, 搞定Spring容器管理

    第01篇:系统化学习, 搞定Spring容器管理

    公众号 : 西魏陶渊明 CSDN : https://springlearn.blog.csdn.net 天下代码一大抄, 抄来抄去有提高, 看你会抄不会抄! Spring 是 java 开发者,永远绕不开的结。 Spring 是非常值得开发者来学习的, 以目前 Spring 在 java 领域的统治性地位, 可以说学 java 就是在学 Spring 。但是作为新入门的开发人

    2023年04月15日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包