記錄開發(fā)簡單職工管理系統(tǒng)遇到的一些問題,黑馬教程
https://www.bilibili.com/video/BV1et411b73Z P147 ~ P166
頭文件與源文件
- 頭文件只聲明,源文件來實現(xiàn)(本質(zhì)上是類內(nèi)聲明類外實現(xiàn))
- 源文件需要引用特定的頭文件
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崗位職責(zé):完成老板交給的任務(wù),并下發(fā)任務(wù)給普通員工" << endl;
}
string Manager::getDeptName() {
return "經(jīng)理";
}
Manager::Manager(int id, string name, int dId) {
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = dId;
}
頭文件重復(fù)引用
#ifndef,#define,#endif
#ifndef 的方式依賴于宏名字不能沖突(最好采用這種方式)
- 保證同一個文件只會被編譯一次
- 內(nèi)容完全相同的兩個文件只會編譯其中一個一次
#pragma once
同一個文件不會被編譯多次(物理上的同一個文件,不是指內(nèi)容相同的兩個文件)
要求整數(shù)卻輸入字符
這種情況下會標(biāo)志位 failbit 被置 1,字符一直在緩沖區(qū)中,沒被讀出,可能出現(xiàn)死循環(huán)
-
cin.restate() 當(dāng)cin.rdstate()返回 0 (即ios::goodbit)時表示無錯誤,可以繼續(xù)輸入或者操作,若返回4則發(fā)生非致命錯誤即ios::failbit,則不能繼續(xù)輸入或操作
-
cin.fail() 可以判斷流操作是否失敗,輸入錯誤后,cin.fail()返回為真 錯誤流標(biāo)志位被置failbit為true, 當(dāng)恢復(fù)時 failbit被設(shè)置為false
-
cin.clear() (默認(rèn)為0 ,即無錯誤)清除錯誤的標(biāo)志位
clear有多種狀態(tài)
- goodbit 無錯誤
- Eofbit 已到達(dá)文件尾
- failbit 非致命的輸入/輸出錯誤,可挽回
- badbit 致命的輸入/輸出錯誤,無法挽回 若在輸入輸出類里.需要加ios::標(biāo)識符號
- 通過設(shè)置cin.clear() 或 cin.clear(istream::goodbit)清除錯誤狀態(tài)
-
cin.ignore() 清除緩沖區(qū)
如果輸入錯誤,通過cin.clear()清除了錯誤狀態(tài)標(biāo)志后,下一次cin輸入時,仍會從緩沖區(qū)中讀取數(shù)據(jù),而之前的錯誤輸入此時仍存在緩沖區(qū)中,所以還會再次被讀取造成錯誤,所以要清空緩沖區(qū)
- cin.ignore(要清除的字節(jié)長度,標(biāo)識)
cin.ignore(1024,’\n’)
該函數(shù)就是將選中的字節(jié)取出拋棄掉(cin操作時是以char為單位的)
標(biāo)識清除的最大長度是1024個字節(jié)。
清除時如果遇到‘\n’就停止,不管是否是1024個字節(jié)。
如果沒有遇到‘\n’就只清除1024個
cin.ignore()的默認(rèn)參數(shù)為cin.ignore(1,EOF),及清除文件描述符前一個字節(jié)
cout << "輸入選擇" << endl;
while (cin >> choice, cin.fail()) {
cout << "輸入有誤,請重新輸入" << endl;
cin.clear(); // 清除錯誤標(biāo)志位
cin.ignore(); // 清除緩沖區(qū)
}
Delete[]
在09講,添加職工函數(shù)中,老師釋放了數(shù)組空間,但沒釋放數(shù)組元素的空間,為什么?
- 依舊需要原來的數(shù)組元素,在釋放數(shù)組前執(zhí)行了原有元素地址的拷貝
- 新數(shù)組 = 舊數(shù)組元素 + 新添加的數(shù)組元素
以下旨在探究 Delete 數(shù)組,會不會調(diào)用數(shù)組元素的析構(gòu)器
答案是不會,需要自己手動調(diào)用
#include <iostream>
using namespace std;
class Father {
public:
Father() = default;
virtual ~Father() {
cout << "父元素析構(gòu)器" << endl;
};
};
class Son1 : public Father {
public:
~Son1() {
cout << "一號子類析構(gòu)器" << endl;
}
};
class Son2 : public Father {
public:
~Son2() {
cout << "二號子類析構(gòu)器" << 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;
}
文件存在且數(shù)據(jù)為空
- 判斷文件是否被打開
- 讀入一個字符,判斷字符是不是文件尾部標(biāo)志
ifs.eof() 判斷是要在讀取到文件結(jié)束符之后才會置為true,意思也就是說即使打開一個空文件,你不讀取里面的數(shù)據(jù),ifs.eof() 會默認(rèn)置為false
peek() 嘗試讀取第一個字符,但不提?。ü鈽?biāo)位不后移)
// 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 進(jìn)行文本文件讀取時,如果讀指針位于文件末尾,無法直接通過調(diào)用seekg(0, ios::beg) 回到文件開頭,而是需要先調(diào)用 clear() 清除指針狀態(tài),再調(diào)用seekg(0, ios::beg) 才能成功返回文件頭
- ios::beg 默認(rèn)的,從流的開頭開始定位
- ios::cur 從流的當(dāng)前位置開始定位
- ios::end 從流的末尾開始定位
override
override明確地表示一個函數(shù)是對基類中一個虛函數(shù)的重載。更重要的是,它會檢查基類虛函數(shù)和派生類中重載函數(shù)的簽名不匹配問題。如果簽名不匹配,編譯器會發(fā)出錯誤信息。
=default
=default
是C++11引入的一種特性,它允許顯式要求編譯器生成默認(rèn)的特殊成員函數(shù)。特殊成員函數(shù)包括默認(rèn)構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、移動構(gòu)造函數(shù)、復(fù)制賦值運(yùn)算符、移動賦值運(yùn)算符以及析構(gòu)函數(shù)
參考資料
cplusplus.com/reference/istream/istream/seekg/
Set Position with seekg() in C++ File Handling - GeeksforGeeks
cin輸入的類型不匹配造成的死循環(huán)CSDN博客
C++-關(guān)鍵字:override(重寫)
【#ifndef, #define, 和 #endif】文章來源:http://www.zghlxwxcb.cn/news/detail-709822.html
c++新特性:=default - 知乎 (zhihu.com)文章來源地址http://www.zghlxwxcb.cn/news/detail-709822.html
到了這里,關(guān)于C++ 學(xué)習(xí)筆記、01 | 開發(fā)簡單職工管理系統(tǒng)遇到的一些問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!