記錄:50多行程序中找出多寫的一個字母e
阿新 • • 發佈:2018-03-15
lan .net ont isp 快樂 sdn p s ora 調試
老賀及時來幫忙,單步執行是法寶。
小霍同學調程序,做的是第11周的項目1 - 存儲班長信息的學生類,可是她寫的程序(就在以下),呃,請讀者自己執行一下吧。(下午在機房調試時用的是Code::Blocks10.05。輸出的是非常長的莫名的符號,晚上在家用的是CodeBlocks12.11,典型的內存溢出癥狀。)
#include <iostream> #include <string> using namespace std; class Stu //聲明基類 { public: Stu(int n, string nam ):num(n),name(nam) {} //基類構造函數 void display( ); //成員函數,輸出基類數據成員 protected: //(*)訪問權限為保護型的數據成員[不能被外界引用但能夠被派生類引用] int num; //學生學號 string name; //學生姓名 }; void Stu::display( ) //成員函數,輸出基類數據成員 { cout<<"學號:"<<num<<endl; cout<<"姓名:"<<name<<endl; } class StuDetail: public Stu //聲明派生類StuDetail { public: //學生nam。學號n。a歲,家住ad。他的班長是nam1。學號n1 StuDetail(int n, string nam,int a, string ad,int n1, string nam1); //派生類構造函數 void show( ); //成員函數,輸出學生的信息 void show_monitor( ); //成員函數。輸出班長信息 private: Stu monitor; //學生所在班的班長。班長是學生。是Stu類的成員 int age; //學生年齡 string addr; //學生的住址 }; StuDetail::StuDetail(int n, string nam,int a, string ad,int n1, string nam1):Stu(n,name),monitor(n1,nam1) { age=a; addr=ad; } void StuDetail::show( ) //成員函數,輸出學生的信息 { cout<<"學生信息:"<<endl; cout<<"學號:"<<num<<endl; cout<<"姓名:"<<name<<endl; cout<<"年齡:"<<age<<endl; cout<<"住址:"<<addr<<endl; } void StuDetail::show_monitor( ) //成員函數,輸出班長信息 { cout<<"班長信息:"<<endl; monitor.display(); } int main( ) { //學生王力,10010號,19歲,家住上海的北京路,他的班長是李孫。學號10001 StuDetail s(10010,"Wang-li",19,"115 Beijing Road,Shanghai",10001,"Li-sun"); s.show( ); //輸出學生信息 s.show_monitor(); //輸出班長信息 return 0; }
在機房調試時用的是Code::Blocks10.05,51行定義並初始化對象s沒有問題。順利通過,而在52行s.show(),輸出了莫名的文字。
再次單步,step into到s.show()中,發現混亂來自於39行輸出name的地方。非常自然,name的值有問題。
name值是通過構造函數獲取的,須要找源頭。
問題出在39行,但思維必須得跳出show函數,找到真正的罪犯。
昏花的老眼看30行的構造函數,一眼就看出了冒號後面對基類構造函數的調用Stu(n,name)有蹊蹺:形式參數中聲明的是(int n, string nam, ...),而實際參數怎麽就出來了(n,name)。去年一個字母e。構造函數的調用該為Stu(n,nam)。
編譯再執行,小霍緊鎖的眉頭放開了。剛才還在怨著計算機的她,應該在反思著自己的大意了。
為何會這樣?錯誤的調用,實際上在用未經初始化的基類成員name作實參,那初始化的結果,name成員仍然是那個“野對象”。
string是C++中添加的類。當中的字符符串實際也是用指針實現的。未經初始化的對象,當中就有野指針。
寫博文時用的是Code::Blocks12.11,單步執行時,51行的構造函數就下不去。焦點仍然能夠鎖定在派生類的構造函數上。問題仍能解決。
編程序,練的就是這番功力。
=================== 迂者 賀利堅 CSDN博客專欄================= |== IT學子成長指導專欄 專欄文章的分類文件夾(不定期更新) ==| |
記錄:50多行程序中找出多寫的一個字母e