青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OnTheWay2012
埋葬昨天的我,迎來重生的我!
posts - 15,  comments - 89,  trackbacks - 0

http://www.shnenglu.com/Tveiker/archive/2011/01/08/138154.aspx本鏈接是“隨筆”寫的一篇名叫《鏈表實驗》的文章,以下是我的分析。

我理解你說的學號的問題是:一個叫X是男性年齡是22歲的學生,假設其學號是2009000,把該學生加入到鏈表之后,該學生的
學號發生了變化,不再是2009000。

如果你所說的學號問題和上面的描述一致的話,該問題產生的原因是:Student類不應該有拷貝構造函數和賦值函數。
 假如為了實現Student類與STL容器搭配使用的能力(要獲得此種能力Student必須有拷貝構造函數和其他一些函數根據你所使用到的容器
 和算法所要求的特殊函數,例如operator<)的話,這兩個函數也應該換種寫法,為了實現此種能力這兩個函數有以下實現方法:
 (1)學號的轉移,參考STL的auto_ptr的控制權轉移策略

 以上是對你碰到問題的說明,另外從你所寫的代碼中還發現了一些問題和不足之處,具體詳述如下:
 問題
  (1)Student的構造函數(Student()、Student(char *name,char* sex,int age))沒有把next初始化
  (2)Student的拷貝構造函數沒有進行if (this != &s)的判斷
  (3)Student類中的Name、Sex可以不使用char*類型(之所以把這個情況說成是問題而不是不足之處是為了以后寫代碼是少犯與指針相關的錯誤)
  (4)在Student類的析構函數中不能對寫“Stu_no--;”這樣的語句,如果想實現學號重用的能夠的話就需要記錄學號的使用情況(本文不討論此問題)

 不足之處
  (1)形如class Student{
  的代碼風格不好,應該修改為
  class Student
  {
  (2)學號不應該是一個整數并且應該隱藏學號這一重要對象的生成方式(因為學號很可能每個學校不一樣,為了應對變化,所以對可能發生變化
    的地方進行封裝)
  (3)Student類不應該包含next指針
  (4)Link類中的Add函數的接口設計很不合理(在使用的時候需要先構造出一個Student,這很沒有必要)
  (5)Link類中的pivot作為類的成員變量不太合適并且沒有多大意義

提醒你一下:請仔細思考拷貝構造函數的意義,拷貝構造的意義簡單來說就是克隆,而你寫的代碼沒有克隆好,所以的導致了學號問題
針對上述所有問題的修改方案有三種
(1)A方案:禁止拷貝構造
(2)B方案:學號轉移 非法學號
各個方案的實現方法如下,其中對于學號的生成方法這二種方案都一樣(為了簡單起見,學號仍然采用整數)

 1/************************************************************************/
 2/*                          學號生成                                    */
 3/************************************************************************/
 4
 5typedef int StudentID;
 6
 7class StudentIDGenerate
 8{
 9public:
10    static StudentID GenerateID()
11    {
12        return StudentBaseID++;
13    }

14
15private:
16    static StudentID StudentBaseID;
17}
;
18
19StudentID StudentIDGenerate::StudentBaseID = 2009000;
20
21/************************************************************************/
22/*                            鏈表節點                                  */
23/************************************************************************/
24template <typename T>
25struct LinkNode
26{
27    T m_value;
28    LinkNode<T> *m_pNext;
29
30    LinkNode() : m_pNext(NULL)
31    {
32
33    }

34}
;
以上是通用代碼,下面是方案A的代碼
  1/************************************************************************/
  2/*                       A方案                                          */
  3/************************************************************************/
  4
  5class Student
  6{
  7    friend class Link;
  8
  9public:
 10    Student();
 11    Student(string const &strName,string const &strSex, int nAge);
 12    ~Student();
 13
 14public:
 15    void display();
 16    void SetValue(string const &strName,string const &strSex, int nAge);
 17    int GetAge() const;
 18
 19private://通過把以下函數設置為私有來實現禁止拷貝構造的能力
 20    Student(const Student &);
 21    Student &operator=(const Student &s);
 22
 23private:
 24    string m_strName;
 25    int m_nAge;
 26    string m_strSex;
 27    StudentID m_ID;
 28}
;
 29
 30typedef LinkNode<Student> StudentNode;
 31
 32Student::Student()
 33{
 34    m_ID = StudentIDGenerate::GenerateID();
 35    m_nAge = 0;
 36}

 37
 38Student::Student(string const &strName,string const &strSex,int nAge)
 39{
 40    m_strName = strName;
 41    m_strSex = strSex;
 42    m_ID = StudentIDGenerate::GenerateID();
 43    m_nAge = nAge;
 44}

 45
 46Student::Student(const Student &s)
 47{
 48    assert(false);
 49}

 50
 51Student &Student::operator =(const Student &s)
 52{
 53    assert(false);
 54    return *this;
 55}

 56
 57Student::~Student()
 58{
 59    
 60}

 61
 62void Student::display() 
 63{
 64    cout<<"Name is:"<<m_strName<<"    ID is:"<<m_ID<<"    Sex is:"<<m_strSex<<"    Age is:"<<m_nAge<<endl;
 65}

 66
 67void Student::SetValue(string const &strName,string const &strSex, int nAge)
 68{
 69    m_strName = strName;
 70    m_strSex = strSex;
 71    m_nAge = nAge;
 72}

 73
 74int Student::GetAge() const
 75{
 76    return m_nAge;
 77}

 78
 79class Link
 80{
 81public:
 82    Link();
 83    ~Link();
 84
 85public:
 86    void Delete(StudentID);
 87    void Add(string const &strName,string const &strSex,int nAge);
 88    void Display();
 89
 90private:
 91    StudentNode *m_pHead;
 92    StudentNode *m_pTail;
 93}
;
 94
 95Link::Link()//構造空鏈表
 96{
 97    m_pHead=NULL;
 98    m_pTail=NULL;
 99}

100
101Link::~Link()//釋放內存
102{
103    while (NULL != m_pHead)
104    {
105        StudentNode *pTemp = m_pHead;
106        m_pHead = m_pHead->m_pNext;
107        delete pTemp;
108    }

109}
    
110
111void Link::Add(string const &strName,string const &strSex,int nAge)//向鏈表中添加學生
112{
113    if(m_pHead==NULL)
114    {
115        m_pHead = new StudentNode();
116        m_pHead->m_value.SetValue(strName, strSex, nAge);
117        m_pTail = m_pHead;
118        m_pTail->m_pNext = NULL;
119    }

120    else
121    {
122        m_pTail->m_pNext = new StudentNode;
123        m_pTail->m_pNext->m_value.SetValue(strName, strSex, nAge);
124        m_pTail->m_pNext->m_pNext = NULL;
125        m_pTail = m_pTail->m_pNext;
126    }

127}

128
129void Link::Display()//顯示鏈表中學生信息
130{
131    cout<<endl;
132    StudentNode *pTemp = m_pHead;
133    while (NULL != pTemp)
134    {
135        pTemp->m_value.display();
136        pTemp = pTemp->m_pNext;
137    }

138    cout<<endl;
139}

140
141void Link::Delete(int nAge)//刪除鏈表中所有年齡為nAge的學生
142{
143    StudentNode *pPre = m_pHead;
144    StudentNode *pCur = m_pHead;
145    while (NULL != pCur)
146    {
147        if (pCur->m_value.GetAge() == nAge)
148        {
149            if (pCur == m_pHead)
150            {
151                pPre = m_pHead = m_pHead->m_pNext;
152            }

153            else
154            {
155                pPre->m_pNext = pCur->m_pNext;
156            }

157            
158            pCur->m_value.display();
159            delete pCur;
160            pCur = NULL != pPre ? pPre->m_pNext : NULL;
161        }

162        else
163        {
164            pPre = pCur;
165            pCur = pCur->m_pNext;
166        }

167    }

168}
以下是測試方案A的代碼
void main()
{
    
//測試零
    
//vector<Student> vecStu;
    
//Student st1;
    
//vecStu.push_back(st1);

    
//Student st2;
    
//vecStu.push_back(st2);

    
//測試一
    Link link;
    link.Add(
"X","Boy",22);
    link.Add(
"Y","Boy",20);
    link.Add(
"Z","Boy",21);
    link.Add(
"U","Girl",22);
    
    link.Display();
    link.Delete(
21);
    
    link.Display();

    
//測試二
    Link link1;
    link1.Add(
"X","Boy",22);
    link1.Add(
"Y","Boy",20);
    link1.Add(
"Z1","Boy",21);
    link1.Add(
"Z2","Boy",21);
    link1.Add(
"U","Girl",22);

    link1.Display();
    link1.Delete(
21);

    link1.Display();

    
//測試三
    Link link2;
    link2.Add(
"X","Boy",22);
    link2.Add(
"Y","Boy",20);
    link2.Add(
"Z1","Boy",21);
    link2.Add(
"Z2","Boy",21);
    link2.Add(
"U","Girl",22);

    link2.Display();
    link2.Delete(
22);

    link2.Display();

    
//測試四
    Link link3;
    link3.Add(
"X","Boy",22);
    
    link3.Display();
    link3.Delete(
22);

    link3.Display();

    
//測試五
    Link link4;
    link4.Add(
"X","Boy",22);
    link4.Add(
"Y","Boy",20);
    link4.Add(
"Z1","Boy",21);
    link4.Add(
"Z2","Boy",21);
    link4.Add(
"U","Girl",22);

    link4.Display();
    link4.Delete(
1);

    link4.Display();
}
其中采用方案A是測試零下面所注釋掉的代碼不能通過編譯,在VC2008的IDE下會報:class“Student”: 沒有可用的復制構造函數或復制構造函數聲明為“explicit”錯誤

為了修正此錯誤,對代碼就行了修改,也就是B方案
const StudentID ErrorStudentID = 0;//其實非法學號是個范圍[負無窮,2009000]   添加的代碼
mutable StudentID m_ID;//為了能夠在拷貝構造函數中修改該值,把其類型聲明為mutable  修改的代碼

//修改的代碼
Student::Student(const Student &s)
{
    m_strName 
= s.m_strName;
    m_strSex 
= s.m_strSex;
    m_ID 
= s.m_ID;
    s.m_ID 
= ErrorStudentID;
    m_nAge 
= s.m_nAge;
}


//修改的代碼
Student &Student::operator =(const Student &s)
{
    
if (this != &s)
    
{
        m_strName 
= s.m_strName;
        m_strSex 
= s.m_strSex;
        m_ID 
= s.m_ID;
        s.m_ID 
= ErrorStudentID;
        m_nAge 
= s.m_nAge;
    }


    
return *this;
}

PS:
使用面向對象語言進行程序設計的時候一個關鍵的問題是:設計一個好的類,這里的Student類就是一個典型的例子。
學習的時候當然可以自己寫個鏈表,自己管理內存;但是在實際工作中還是要多用STL現成的容器和算法,只有這樣才能提高代碼的質量,降低錯誤發生的概率。
上面代碼實際還可以繼續進行改進,不夠寫道此種程度基本上沒有什么大問題了。
posted on 2011-01-09 07:45 OnTheWay 閱讀(1641) 評論(2)  編輯 收藏 引用 所屬分類: 個人感悟

FeedBack:
# re: 對“隨筆”所寫的一篇文章《鏈表實驗》的一點看法
2011-01-09 11:17 | あ維wêiセ
謝謝咯,呵呵。我喜歡這代碼風格,向你學習  回復  更多評論
  
# re: 對“隨筆”所寫的一篇文章《鏈表實驗》的一點看法
2011-01-09 19:58 | 陳梓瀚(vczh)
我認為問題只需要修改成,只將某一個指定的vector<Student>里面的Student實例視為合法實例就好了。其他地方存放的Student都是非法的,但是不禁止復制,只是復制后改了也沒用的意思。  回復  更多評論
  

<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

友情連接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一级理论片| 日韩视频免费在线| 欧美激情综合色| 午夜精品久久久久久久久久久久| 国产精品日韩精品| 欧美三区在线视频| 老司机午夜精品| 久久久999精品| 欧美一区二区三区四区在线观看地址 | 国产精品免费看| 欧美日韩一区二区三区免费看| 久久综合国产精品| 久久蜜桃香蕉精品一区二区三区| 亚洲小视频在线观看| aⅴ色国产欧美| 亚洲主播在线播放| 亚洲一区二区三区精品视频| 在线视频免费在线观看一区二区| 亚洲激情偷拍| 一区二区三区日韩欧美| 日韩香蕉视频| 欧美一区二区视频97| 久久这里有精品15一区二区三区| 久久综合色影院| 欧美精品福利在线| 国产精品腿扒开做爽爽爽挤奶网站| 午夜视频一区二区| 亚洲欧美久久久久一区二区三区| 最新日韩欧美| 亚洲丁香婷深爱综合| 亚洲三级国产| 老司机久久99久久精品播放免费| 久久视频在线视频| 欧美天天在线| 狠狠干综合网| 亚洲欧美激情一区| 欧美一区二区黄色| 欧美大胆成人| 亚洲午夜国产一区99re久久 | 老牛嫩草一区二区三区日本| 欧美日韩中文字幕综合视频| 精品1区2区| 欧美一区二区三区视频| 日韩视频欧美视频| 久久另类ts人妖一区二区| 国产精品美女www爽爽爽视频| 亚洲精品国产日韩| 蜜臀av一级做a爰片久久| 先锋a资源在线看亚洲| 欧美日韩www| 日韩一级片网址| 亚洲第一网站| 欧美日韩国产小视频在线观看| 亚洲第一狼人社区| 久久久久久亚洲综合影院红桃| 亚洲永久免费精品| 国产精品综合不卡av| 久久gogo国模啪啪人体图| 亚洲一区二区三| 国产精品亚洲综合久久| 欧美在线|欧美| 欧美专区在线观看一区| 国色天香一区二区| 亚洲国产精品一区在线观看不卡| 欧美风情在线| 中文在线资源观看网站视频免费不卡 | 国产精品久久久久久久久久妞妞| 亚洲图片在线观看| 亚洲欧美一区二区精品久久久| 激情综合色综合久久| 欧美黑人在线播放| 欧美日韩一区二区三区| 欧美有码在线观看视频| 久久久久一区二区三区| 妖精视频成人观看www| 亚洲一区欧美一区| 亚洲国产欧美精品| 亚洲综合日本| 亚洲靠逼com| 久久岛国电影| 亚洲一区久久久| 欧美成人午夜激情| 久久成人精品无人区| 欧美区在线观看| 免费在线观看成人av| 国产精品入口66mio| 亚洲国产另类精品专区| 狠狠网亚洲精品| 亚洲一区二区高清视频| 一区二区欧美在线观看| 久热精品视频在线观看一区| 亚洲欧美在线播放| 一本一本久久| 欧美mv日韩mv国产网站| 久久嫩草精品久久久精品| 国产伦精品一区二区三区在线观看| 亚洲国产成人av| 在线亚洲激情| 国产精品高清一区二区三区| 亚洲免费观看在线观看| 一道本一区二区| 欧美日韩一区三区| 亚洲图色在线| 久久精品亚洲| 亚洲黄色一区二区三区| 老鸭窝毛片一区二区三区| 久久综合久久综合久久| 亚洲电影专区| 欧美日韩一区二区三区在线观看免| 日韩视频在线观看一区二区| 亚洲一区二区三区在线| 国产精品久久一区主播| 欧美精品videossex性护士| 国产亚洲精品v| 亚洲欧美制服另类日韩| 欧美激情免费在线| 免费精品视频| 亚洲理伦电影| 国产精品久久一卡二卡| 欧美中文字幕在线播放| 亚洲欧洲一区二区三区久久| 亚洲精品三级| 黄色精品在线看| 欧美激情1区2区| 久久一本综合频道| 亚洲免费观看高清完整版在线观看| 欧美一区视频| 日韩视频―中文字幕| 国产欧美精品久久| 欧美日韩在线播放一区| 久久综合伊人77777| 午夜精品久久久久久久久久久久久 | 欧美视频在线免费| 免费视频亚洲| 欧美综合国产| 午夜精品在线观看| 亚洲无限乱码一二三四麻| 亚洲理论电影网| 亚洲国产精品一区二区第四页av | 日韩一区二区久久| 亚洲黄一区二区三区| 影音先锋成人资源站| 国产日韩免费| 国外精品视频| 国产精品久久久久久久7电影| 欧美成人午夜激情在线| 老鸭窝91久久精品色噜噜导演| 欧美亚洲尤物久久| 久久成人精品无人区| 欧美在线视频一区二区| 欧美专区18| 欧美aⅴ99久久黑人专区| 能在线观看的日韩av| 久久综合伊人77777| 欧美电影在线观看完整版| 欧美激情一区二区| 国产精品视频自拍| 亚洲国产毛片完整版| 一区二区三区精品视频在线观看| 一区二区三区视频免费在线观看| 亚洲欧美另类久久久精品2019| 欧美一区二区三区喷汁尤物| 久久久久久久久久看片| 可以免费看不卡的av网站| 欧美福利视频一区| 91久久综合| 小嫩嫩精品导航| 老司机凹凸av亚洲导航| 欧美精品激情blacked18| 国产精品日韩精品| 99re成人精品视频| 可以免费看不卡的av网站| 99riav国产精品| 蜜臀91精品一区二区三区| 欧美亚洲成人免费| 99国产精品一区| 欧美大胆成人| 久久人人爽国产| 国内精品视频久久| 亚洲一区二区免费看| 亚洲激情在线观看视频免费| 亚洲欧美另类国产| 欧美三级视频在线播放| 亚洲精品日韩在线观看| 久久尤物视频| 久久这里只精品最新地址| 国产亚洲欧美日韩美女| 欧美在线播放视频| 亚洲美女视频在线观看| 久久综合九色综合网站| 亚洲大片av| 欧美激情视频在线免费观看 欧美视频免费一 | 一本色道久久综合亚洲精品高清| 欧美激情在线观看| 欧美另类69精品久久久久9999| 一区二区91| 久久黄色网页| 亚洲午夜久久久久久尤物| 欧美在线观看www| 亚洲精品一区在线观看|