有了一定的C基礎之后,目前正在學習C++,今天嘗試用面向對象的思想編寫了一個簡單的通訊錄(之前在C的練習中做過類似的項目)
通過不停的敲代碼,出現問題也解決問題的過程中也稍微總結了一下新的知識。
遇到的第一個問題即是,我自定義了一個Person類用來存放每個聯系人的信息,然而在創建了一個容器vector<Person>V(0)后,
查閱了一下其他大神博客中寫的demo,發現都是用存放基本類型int來舉例子,初始化直接用V.push_back(int)就可以,但是自定義的類中,私有成員不止一個,但是這個函數我在用的過程中發現能且只能傳一個參數,也就是只能初始化一個私有成員,其他私有成員只能通過默認構造函數初始化,其他的私有成員只能通過賦值的方式再去重新寫入。
第二個問題,再用vector<Person>::iterator iter 迭代器遍歷的時候,如果要刪除某個元素,或者用Vector.push_back()插入一個元素的時候,迭代器就會失效。這時候如果不重置迭代器,iter會相當于一個野指針,編譯器也會報類似的錯誤。
下面貼上我寫的代碼:
#include <iostream>#include <vector>#include <map>#include "addr_book.h"using namespace std;int main(){ Tool T;T.enter_menu();vector<Person>V(0);//map<int,Person>M;//map<int,Person>::iterator it; int n;int count;char name[20];int tel;//Person P;while(1){ count = 0;memset(name,0,sizeof(name)); cout << "請輸入操作命令:"; cin >> n; switch (n) { case 1: { cout << "請輸入聯系人姓名:"; cin >> name; cout << "請輸入聯系人電話:"; cin >> tel; V.push_back(name); (V.back()).Tel(tel);break; }case 2:{ if(V.capacity() == 0){ cout << "未錄入聯系人!" << endl;break;}cout << "請輸入查找的聯系人姓名:"; cin >> name; for(vector<Person>::iterator it = V.begin(); it != V.end();++it){ count = ((*it).Compare(name,count));} if(count == 0){ cout << "查無此人!" << endl;} break;}case 3:{ if(V.capacity() == 0){ cout << "未錄入聯系人!" << endl;break;} for(vector<Person>::iterator it = V.begin(); it != V.end(); ++it){ (*it).Display();}break;}case 4:{ if(V.capacity() == 0){ cout << "未錄入聯系人!" << endl;break;}cout << "請輸入要修改的聯系人姓名:";cin >> name;for(vector<Person>::iterator it = V.begin(); it != V.end();++it) { count = ((*it).Update(name,count));} if(count == 0){ cout << "查無此人!" << endl;} break; } case 5:{ if(V.capacity() == 0){ cout << "未錄入聯系人!" << endl;break;} cout << "請輸入要刪除的聯系人姓名:";cin >> name;for(vector<Person>::iterator it = V.begin(); it != V.end();++it) { int i = ((*it).Delete(name));if(i == 0){ V.erase(it);cout << "刪除成功!" << endl;count++;break;}}if(count == 0){ cout << "查無此人!" << endl;} break; } case 6:{ return 0;}case 0:{ T.enter_menu();break;}default:{ cout << "輸入有誤,請重輸!" << endl; break;} }} return 0;}
#ifndef _ADDR_BOOK_H#define _ADDR_BOOK_H#include <vector>class Person{public: Person();Person(char *name);Person(int tel);Person(int tel,char *name);Person(char *name,int tel);void Tel(int tel);void Display();~Person();int Compare(char *name,int count);int Update(char *name,int count);int Delete(char *name);//friend void search(char *name,vector<Person> V);PRivate: char name_[20];int tel_;};class Tool{public: Tool();~Tool();void enter_menu();private:};#endif
#include <iostream>#include <vector>#include <string.h>#include "addr_book.h"using namespace std;#include <string.h>Person::Person(){ *name_ = '/0';tel_ = 0;}Person::Person(int tel){ tel_ = tel;}Person::Person(char *name){ //name_ = name;strcpy(name_,name);}Person::Person(int tel, char *name){ tel_ = tel;//name_ = name;}Person::Person(char *name,int tel){ tel_ = tel;//name_ = name;strcpy(name_,name);}void Person::Tel(int tel){ tel_ = tel;}void Person::Display(){ cout << name_ << " " << tel_ << endl;}Person::~Person(){}int Person::Compare(char *name,int count){ if(strcmp(name,name_) == 0){ Display();count++;}else{ return count;}}int Person::Update(char *name,int count){ if(strcmp(name,name_) == 0){ Display();cout <<"請輸入修改后的姓名:";cin >> name_;cout << "請輸入修改后的手機號碼:";cin >>tel_;count++;} else{ return count;}}int Person::Delete(char *name){ if(strcmp(name,name_) == 0){ return 0;}return -1;}/*****************************華美的分割線***********************//*void search(char *name,vector<Person> V){ int count = 0;for(vector<Person>::iterator it = V.begin(); it != V.end; ++it){ if(strcmp(name,(*it).name_) == 0){ (*it).Display;count++;}}if(count == 0){ cout << "查無此人" <<endl;}}*//*****************************華美的分割線***********************/Tool::Tool(){}Tool::~Tool(){}void Tool::enter_menu(){ cout << endl;cout << (" *******歡迎使用通訊錄*******") << endl;cout << (" * *") << endl;cout << (" *1. 添加聯系人信息 *") << endl;cout << (" *2. 查找聯系人信息 *") << endl;cout << (" *3. 顯示聯系人信息 *") << endl;cout << (" *4. 修改聯系人信息 *") << endl;cout << (" *5. 刪除聯系人信息 *") << endl;cout << (" *6. 退出 *") << endl;cout << (" *7. *") << endl;cout << (" *8. 按0呼出主菜單 *") << endl;cout << (" *********************") << endl;cout << endl;}
新聞熱點
疑難解答
圖片精選