[小霍同學](http://blog.csdn.net/u012369069)調程序,做的是第11周的[項目1 - 存儲班長信息的學生類](http://blog.csdn.net/sxhelijian/article/details/25141489),但是她寫的程序(就在下面),呃,請讀者自己運行一下吧。(下午在機房調試時用的是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學子成長指導專欄 專欄文章的分類目錄(不定期更新) ==|
|== C++ 課堂在線專欄 賀利堅課程教學鏈接(分課程年級) ==|
|== 我寫的書——《逆襲大學——傳給IT學子的正能量》 ==|
=====?為IT菜鳥起飛鋪跑道,和學生一起享受快樂和激情的大學 =====
~~~
|
|-----|