第二個小專案--職工管理系統
只完成一半
先記錄一下,我覺的C++ 很多時間,很多程式碼就是操作記憶體。
答題和通訊錄管理系統差不多,不同的是使用到 了類的多型,使用檔案儲存。還有一些技巧性,規範性的東西。
根據職責不同,不同職責的人繼承一個抽象類。這個反而不重要。
定義一個Manage類,實現核心功能,增刪改查等。重要。
由於涉及到了資料的儲存,所以讓我長了一個很大的見識就是將 判斷檔案是否存在,檔案是否為空,檔案中有多少個人的資料(int get_num),讀取檔案的資料到記憶體(void init) 這些功能(當然這些功能需要細化到幾個函式來實現) 全都放在了類的建構函式中,然後使用幾個變數或布林值記錄一下狀態,很6。這可能就是好的架構吧。
有一個變數是 Worker ** p = new Worker*[size],指向指標陣列的指標,用這個指向指標陣列的指標來管理 每一個人。陣列中為每一個人例項化的指標,通過對p的操作,通過多型,就可以將操作精細到每個人,目前小白的角度,覺的很6。比如說
void System::ShowPeople() { if (!this->FileisExit && this->FileisEmpty) { cout << "資料庫不存在!!!" << endl; } else { if (this->FileisExit && this->FileisEmpty) { cout << "資料庫為空" << endl; } else { for (int i = 0; i < this->DbFileNum; i++) { this->m_person[i]->ShowJob(); } } } }
增,刪,改,查 都會與這個 p指標 打交道。
總結下坑
1 switch 我踩了兩個坑。
switch (x) { cout << "xyz" << endl; case 1: break; case 2: break; default: break; }
一個是xyz不會列印, 根據x直接跳到 符合的case中,執行相應的邏輯
二是 case一定要帶break,不帶break,會繼續往下執行,!!
2 判斷 檔案為空
讀取一個字元,看到沒到結尾。
char ch; ifs >> ch; if (ifs.eof()) { this->FileisExit = true; this->FileisEmpty = true; this->DbFileNum = 0; this->m_person = NULL; }
3 知道每一行的固定格式,讀取全部內容
int System::GetDbNum() { ifstream ifs(filename, ios::in); int id; int did; string name; int num = 0; while (ifs>>id && ifs >> did && ifs>>name) { num++; } ifs.close(); return num; }
4 init 從檔案中 初始化 記憶體中,變數儲存。這就是前面我說的在建構函式中實現的一個功能。666
void System::init() { int id; int did; string name; ifstream ifs(filename, ios::in); int index = 0; while (ifs >> id && ifs >> did && ifs>>name) { Person* p = NULL; switch (did) { case 1: { p = new Boss(id, did, name); this->m_person[index] = p; index++; break; } case 2: { p = new Employee(id, did, name); this->m_person[index] = p; index++; break; } } } ifs.close(); }
建構函式中實現的另一個功能,獲取檔案中有多少個人。
int System::GetDbNum() { ifstream ifs(filename, ios::in); int id; int did; string name; int num = 0; while (ifs>>id && ifs >> did && ifs>>name) { num++; } ifs.close(); return num; }
5 解構函式
對手動開闢的空間釋放分三步
判斷指標p是不是空。
如果不為空,delete 指標p
指標p = NULL。賦值
System::~System() { cout << "解構函式 " << endl; if (this->m_person != NULL) { for (int i = 0; i < this->DbFileNum; i++) if (this->m_person[i] != NULL) { delete this->m_person[i]; } delete[] this->m_person; this->m_person = NULL; } }
6 建構函式
System::System() { ifstream ifs(filename, ios::in); if (!ifs.is_open()) { this->FileisExit = false; this->FileisEmpty = true; this->DbFileNum = 0; this->m_person = NULL; } else { char ch; ifs >> ch; if (ifs.eof()) { this->FileisExit = true; this->FileisEmpty = true; this->DbFileNum = 0; this->m_person = NULL; } else { this->FileisExit = true; this->FileisEmpty = false; this->DbFileNum = this->GetDbNum(); this->m_person = new Person * [this->DbFileNum]; this->init(); } } ifs.close(); }
7 新增人員
void System::AddPeople() { int newsize = this->DbFileNum + 1; cout << "newsize: " << newsize << endl; Person** newspace = new Person * [newsize]; for (int i = 0; i < this->DbFileNum; i++) { newspace[i] = this->m_person[i]; } int cho; cout << "請選擇建立的人員 1 : boss 2 : employerr " << endl; cin >> cho; int id; cout << "請輸入 id : " << endl; cin >> id; int did; cout << "請輸入職業 1 :boss 2 :employee " << endl; cin >> did; string name; cout << "請輸入姓名 : " << endl; cin >> name; cout << "DbFileNum: " << this->DbFileNum << endl; switch (cho) { case 1: { Person* p = new Boss(id, did, name); cout << "1" << endl; p->ShowJob(); newspace[newsize - 1] = p; break; } case 2: { Person* p = new Employee(id, did, name); cout << " this->DbFileNum: "<< this->DbFileNum << "newsize: " << newsize << endl; p->ShowJob(); newspace[newsize-1] = p; cout << "33" << endl; break; } } this->DbFileNum = newsize; delete[] this->m_person; this->m_person = newspace; this->FileisExit = false; this->save(); }