首页 > 编程语言 >C++ 学习笔记、01 | 开发简单职工管理系统遇到的一些问题

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

时间:2023-09-16 21:46:09浏览次数:52  
标签:文件 01 错误 管理系统 清除 ios cin C++ 数组

记录开发简单职工管理系统遇到的一些问题,黑马教程
https://www.bilibili.com/video/BV1et411b73Z P147 ~ P166

头文件与源文件

image-20230916205810968
  • 头文件只声明,源文件来实现(本质上是类内声明类外实现)
  • 源文件需要引用特定的头文件
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)

标签:文件,01,错误,管理系统,清除,ios,cin,C++,数组
From: https://www.cnblogs.com/linxiaoxu/p/17707351.html

相关文章

  • Java多线程学习(Day01)
    目录线程简介线程实现(重点)线程状态线程同步(重点)线程通信问题进程与线程概念                                     --来自百度百科的解释:        进程(Process)是......
  • 合并果子题解-C++ STL priority_queue容器的使用
    说明:本博文关于priority_queue容器的说明来源于www.cnblogs.com/fusiwei/p/11823053.html本人是刚刚接触算法竞赛的萌新,如果有大佬发现了错误,还望指出(真的有人会看本蒟蒻的博文吗)这是我的第一篇博文,更多是作为测试以后会将博客作为笔记记录学习的体会基本概念priority_queu......
  • 2018-2019 ACM-ICPC Brazil Subregional Programming Contest
    B.Marbles题解显然如果存在棋子位于\((x,x)\),那么一定先手必胜容易发现必败态位于\((1,2)\)和\((2,1)\),那么我们可以通过\(sg\)函数暴力打表得到并且玩家一定不会将棋子移动至\((0,i),(i,0),(i,i)\)这三种情况上,因为谁移动到这些位置,对手一定处于必胜态intn,f[N][......
  • c++论文查重
    github连接这个作业属于哪个课程软件工程这个作业要求在哪里在这里这个作业的目标了解PSP,写一个论文查重程序,使用github管理项目PSP表PSP2.1PersonalSoftwareProcessStages预估耗时(分钟)实际耗时(分钟)Planning计划2020Estimate估计这个任......
  • 米联客MLK-CU01-040-060 AMD UltraScale核心模块硬件手册
    1整体概述MLK-CU01-040-060核心模块是米联客电子KintexUltraScale系列开发平台的全新高端产品。其核心模块集成电源管理:0.95V核心电源,最大输出24A。用户基于核心模块设计功能底板(提供功能底板设计方案)。降低项目功能底板设计难度和生产成本,加速项目开发。其应用领域包含高速通......
  • 智慧工地管理系统的功能模块有哪些?
    智慧工地管理系统将人工智能技术、传感器技术、虚拟现实技术等更多高新技术嵌入到建筑、机器、人员佩戴的设备、工地出入口大门等各种物体中,广泛互联形成“物联网技术”,再与“互联网技术”融合,完成项目管理利益相关者与项目施工现场的融合。智慧施工现场的关键是以“更智能”的形式......
  • C++20起支持的一个小特性
    注释掉的为传统的写法,从C++20起支持default关键字修饰的写法,即使是成员变量有多个的时候也支持,减轻了程序员的心智负担。......
  • C++ STL 编程指北
    C++STL编程指北未避免歧义,所有容器的swap方法和不常用方法均未写1.vector向量容器用一句话来说,vector就是可变长数组。但vector所支持的可变长特性,并不是在原空间之后接续新空间来实现的,因为无法保证之后尚有可供分配的空间。底层实现上当增加新元素时,如果当前vector容......
  • C++关于字符串的一些函数
    islower,isupper返回类型为int,当符合条件时返回非零值,并不一定是1,0tolower,toupper返回类型为int。isdigit判断一个字符是否是十进制数字,返回值:返回值为非零(真)表示c是十进制数字,返回值为零(假)表示c不是十进制数字。isalphaisalpha()用来判断一个字符是否为字母,如果是字符......
  • 米联客MLK-CZ05 AMD ZYNQ 7015核心模块硬件手册
    1整体概述自2017年米联客MLK-CZ05-7015-485(MZ7XCORE485)系列开发平台发布以来,米联客ZYNQ系列开发平台和核心模块经过多次迭代升级,在工业自动化、水利电力控制设备、医疗图像设备等领域广泛应用,产品性能接受了广大客户的检验,稳定可靠。2021年因芯片普遍紧缺涨价,核心模块再次......