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

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

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

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

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

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

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

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

 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/*                            鏈表節(jié)點                                  */
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://通過把以下函數(shù)設置為私有來實現(xiàn)禁止拷貝構造的能力
 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”: 沒有可用的復制構造函數(shù)或復制構造函數(shù)聲明為“explicit”錯誤

為了修正此錯誤,對代碼就行了修改,也就是B方案
const StudentID ErrorStudentID = 0;//其實非法學號是個范圍[負無窮,2009000]   添加的代碼
mutable StudentID m_ID;//為了能夠在拷貝構造函數(shù)中修改該值,把其類型聲明為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現(xiàn)成的容器和算法,只有這樣才能提高代碼的質量,降低錯誤發(fā)生的概率。
上面代碼實際還可以繼續(xù)進行改進,不夠寫道此種程度基本上沒有什么大問題了。
posted on 2011-01-09 07:45 OnTheWay 閱讀(1639) 評論(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>
            亚洲天堂久久| 欧美激情视频网站| 午夜欧美大尺度福利影院在线看| 久久综合国产精品| 免费观看不卡av| 亚洲女与黑人做爰| 欧美一区二区高清在线观看| 亚洲国产精品视频一区| 性伦欧美刺激片在线观看| 亚洲国产精品日韩| 亚洲深夜影院| 国产亚洲欧美日韩日本| 亚洲精品国产品国语在线app| 国产精品久久久久久久久久免费看 | 国产精品揄拍500视频| 亚洲宅男天堂在线观看无病毒| 欧美有码在线视频| 这里只有精品视频| 欧美 日韩 国产精品免费观看| 亚洲自拍三区| 免费不卡中文字幕视频| 久久夜色精品亚洲噜噜国产mv| 男男成人高潮片免费网站| 亚洲女性喷水在线观看一区| 欧美激情国产日韩| 欧美激情一二区| 亚洲精品免费一区二区三区| 欧美日韩1区2区| 亚洲精品一区在线观看香蕉| 一本色道久久88综合日韩精品| 国产一区二区在线免费观看 | 欧美精品一区二区三区视频| 亚洲综合丁香| 亚洲精品欧美极品| 你懂的亚洲视频| 久久精品国产99国产精品澳门| 在线午夜精品自拍| 最新日韩中文字幕| 红桃视频一区| 国产欧美精品一区二区三区介绍| 欧美极品在线播放| 一区二区av| 99国产精品99久久久久久粉嫩| 蜜臀av一级做a爰片久久| 欧美亚洲在线视频| 亚洲一区免费观看| 亚洲精品少妇网址| 亚洲日本中文字幕| 亚洲第一区色| 黄色av成人| 伊人久久成人| 久久精品国产精品亚洲精品| av成人免费观看| 夜夜嗨av一区二区三区| 一区视频在线播放| 国产在线播放一区二区三区| 欧美日韩精品一区二区三区四区| 久久国内精品自在自线400部| 亚洲欧洲一区二区天堂久久| 亚洲福利视频网| 蜜桃av一区| 欧美一区二区在线播放| 午夜视频久久久久久| 午夜精品国产精品大乳美女| 欧美在线国产精品| 欧美亚洲网站| 鲁大师影院一区二区三区| 麻豆精品视频在线| 亚洲国产精品成人精品| 夜夜爽www精品| 亚洲欧美日韩精品一区二区| 欧美在线一区二区三区| 久久经典综合| 欧美成人精品h版在线观看| 欧美日韩高清在线观看| 国产精品高潮呻吟久久| 国产日韩精品久久久| 国产小视频国产精品| 国模私拍一区二区三区| 亚洲国产天堂久久综合网| 99国产精品久久久久久久| 亚洲一区二区三区四区五区午夜 | 亚洲欧美在线视频观看| 久久久久久国产精品mv| 欧美国产一区二区在线观看| 夜夜嗨av一区二区三区中文字幕| 性娇小13――14欧美| 欧美激情麻豆| 国产一区二区福利| 日韩网站在线看片你懂的| 亚洲欧美一区二区三区久久| 免费成年人欧美视频| 夜夜狂射影院欧美极品| 久久影院午夜片一区| 欧美日韩国产一区二区三区| 国产亚洲制服色| 亚洲精品久久久久久久久久久 | 国产精品亚洲产品| 最新亚洲激情| 久久精品一区四区| 亚洲卡通欧美制服中文| 欧美精品一区二区在线播放| 国产精品狼人久久影院观看方式| 国产精品久久精品日日| 亚洲电影在线播放| 欧美在线观看一区二区三区| 欧美激情精品久久久久久变态| 日韩一区二区免费看| 欧美在线亚洲在线| 国产精品久久看| 亚洲理伦电影| 久久影音先锋| 亚洲欧美视频在线观看| 欧美日本韩国| 狠狠色丁香婷婷综合影院| 在线视频欧美日韩精品| 噜噜噜91成人网| 午夜精品久久久久久久男人的天堂| 欧美日韩成人激情| 激情视频一区二区| 性欧美1819性猛交| 国产精品99久久久久久久久久久久 | 国产精品卡一卡二| 一本大道av伊人久久综合| 免费成人黄色片| 久久久久.com| 国产一区美女| 美女网站久久| 久久全球大尺度高清视频| 激情婷婷亚洲| 巨乳诱惑日韩免费av| 欧美亚洲一区二区在线| 国产欧美在线观看| 久久久久久91香蕉国产| 久久九九久精品国产免费直播| 国产有码在线一区二区视频| 欧美在线网址| 久久精品国产欧美亚洲人人爽| 国产一区视频在线观看免费| 久久这里只有| 久久免费视频一区| 亚洲精品欧美| 国产精品99久久久久久www| 国产精品美女主播| 久久精品五月婷婷| 欧美一区在线直播| 亚洲欧洲日本专区| 99re66热这里只有精品3直播| 国产精品激情av在线播放| 亚洲欧美日韩精品久久奇米色影视 | 亚洲深夜福利网站| 亚洲在线日韩| 国产婷婷一区二区| 亚洲二区三区四区| 欧美日韩精选| 欧美日韩国产一区二区三区| 欧美一区激情视频在线观看| 欧美激情精品久久久久久蜜臀| 亚洲男人的天堂在线观看| 久久综合九色99| 久久久久久69| 激情丁香综合| 免费久久精品视频| 麻豆精品视频| 中文欧美字幕免费| 亚洲一区二区视频在线观看| 99riav1国产精品视频| 国产精品国产三级国产a| 久久久久久999| 欧美精品尤物在线| 欧美在线观看视频一区二区三区| 欧美日韩精品一区| 亚洲第一天堂av| 国产在线精品成人一区二区三区| 久久综合色88| 午夜宅男欧美| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲精品国产精品乱码不99按摩| 免费看av成人| 国产精品亚洲激情| 亚洲福利久久| 国产在线乱码一区二区三区| 亚洲国产天堂久久综合网| 国产欧美日韩高清| 91久久精品网| 狠狠色丁香婷婷综合| 亚洲欧美日产图| 日韩亚洲在线观看| 久久久久一区二区三区四区| 午夜精品福利视频| 欧美激情中文字幕乱码免费| 久久综合狠狠| 国产精自产拍久久久久久蜜| 一区二区高清| 亚洲精品自在在线观看| 亚洲福利视频一区| 亚洲精品一区二区三区四区高清| 久久精品一二三| 久久免费视频网站| 国产一区二区日韩精品欧美精品|