Bjarne Stroustrup博士,1950年出生于丹麥,先后畢業(yè)于丹麥阿魯斯大學(xué)和英國(guó)劍撟大學(xué),AT&T大規(guī)模程序設(shè)計(jì)研究部門負(fù)責(zé)人,AT&T 貝爾實(shí)驗(yàn)室和ACM成員。1979年,B. S開始開發(fā)一種語言,當(dāng)時(shí)稱為"C with Class",后來演化為C++。1998年,ANSI/ISO C++標(biāo)準(zhǔn)建立,同年,B. S推出其經(jīng)典著作The C++ Programming Language的第三版。
你的編譯器可能有問題。也許它太老了,也許你安裝它的時(shí)候出了錯(cuò),也許你用的計(jì)算機(jī)已經(jīng)是個(gè)古董。在諸如此類的問題上,我無法幫助你。
但是,這也是很可能的:你要編譯的程序設(shè)計(jì)得非常糟糕,以至于編譯器不得不檢查數(shù)以百計(jì)的頭文件和數(shù)萬行代碼。理論上來說,這是可以避免的。如果這是你購(gòu)買的庫的設(shè)計(jì)問題,你對(duì)它無計(jì)可施(除了換一個(gè)更好的庫),但你可以將你自己的代碼組織得更好一些,以求得將修改代碼后的重新編譯工作降到最少。這樣的設(shè)計(jì)會(huì)更好,更有可維護(hù)性,因?yàn)樗鼈冋故玖烁玫母拍钌系姆蛛x。
看看這個(gè)典型的面向?qū)ο蟮某绦蚶樱?BR> class Shape {
public: // 使用Shapes的用戶的接口
virtual void draw() const;
virtual void rotate(int degrees);
// ...
protected: // common data (for implementers of Shapes)
Point center;
Color col;
// ...
};
class Circle : public Shape {
public:
void draw() const;
void rotate(int) { }
// ...
protected:
int radius;
// ...
};
class Triangle : public Shape {
public:
void draw() const;
void rotate(int);
// ...
protected:
Point a, b, c;
// ...
};
設(shè)計(jì)思想是,用戶通過Shape的public接口來操縱它們,而派生類(例如Circle和Triangle)的實(shí)現(xiàn)部分則共享由protected成員表現(xiàn)的那部分實(shí)現(xiàn)(implementation)。
這不是一件容易的事情:確定哪些實(shí)現(xiàn)部分是對(duì)所有的派生類都有用的,并將之共享出來。因此,與public接口相比,protected成員往往要做多得多的改動(dòng)。舉例來說,雖然理論上“中心”(center)對(duì)所有的圖形都是一個(gè)有效的概念,但當(dāng)你要維護(hù)一個(gè)三角形的“中心”的時(shí)候,是一件非常麻煩的事情——對(duì)于三角形,當(dāng)且僅當(dāng)它確實(shí)被需要的時(shí)候,計(jì)算這個(gè)中心才是有意義的。
protected成員很可能要依賴于實(shí)現(xiàn)部分的細(xì)節(jié),而Shape的用戶(譯注:user此處譯為用戶,指使用Shape類的代碼,下同)卻不見得必須依賴它們。舉例來說,很多(大多數(shù)?)使用Shape的代碼在邏輯上是與“顏色”無關(guān)的,但是由于Shape中“顏色”這個(gè)定義的存在,卻可能需要一堆復(fù)雜的頭文件,來結(jié)合操作系統(tǒng)的顏色概念。
當(dāng)protected部分發(fā)生了改變時(shí),使用Shape的代碼必須重新編譯——即使只有派生類的實(shí)現(xiàn)部分才能夠訪問protected成員。
于是,基類中的“實(shí)現(xiàn)相關(guān)的信息”(information helpful to implementers)對(duì)用戶來說變成了象接口一樣敏感的東西,它的存在導(dǎo)致了實(shí)現(xiàn)部分的不穩(wěn)定,用戶代碼的無謂的重編譯(當(dāng)實(shí)現(xiàn)部分發(fā)生改變時(shí)),以及將頭文件無節(jié)制地包含進(jìn)用戶代碼中(因?yàn)椤皩?shí)現(xiàn)相關(guān)的信息”需要它們)。有時(shí)這被稱為“脆弱的基類問題”(brittle base class problem)。
你的編譯器可能有問題。也許它太老了,也許你安裝它的時(shí)候出了錯(cuò),也許你用的計(jì)算機(jī)已經(jīng)是個(gè)古董。在諸如此類的問題上,我無法幫助你。
但是,這也是很可能的:你要編譯的程序設(shè)計(jì)得非常糟糕,以至于編譯器不得不檢查數(shù)以百計(jì)的頭文件和數(shù)萬行代碼。理論上來說,這是可以避免的。如果這是你購(gòu)買的庫的設(shè)計(jì)問題,你對(duì)它無計(jì)可施(除了換一個(gè)更好的庫),但你可以將你自己的代碼組織得更好一些,以求得將修改代碼后的重新編譯工作降到最少。這樣的設(shè)計(jì)會(huì)更好,更有可維護(hù)性,因?yàn)樗鼈冋故玖烁玫母拍钌系姆蛛x。
看看這個(gè)典型的面向?qū)ο蟮某绦蚶樱?BR> class Shape {
public: // 使用Shapes的用戶的接口
virtual void draw() const;
virtual void rotate(int degrees);
// ...
protected: // common data (for implementers of Shapes)
Point center;
Color col;
// ...
};
class Circle : public Shape {
public:
void draw() const;
void rotate(int) { }
// ...
protected:
int radius;
// ...
};
class Triangle : public Shape {
public:
void draw() const;
void rotate(int);
// ...
protected:
Point a, b, c;
// ...
};
設(shè)計(jì)思想是,用戶通過Shape的public接口來操縱它們,而派生類(例如Circle和Triangle)的實(shí)現(xiàn)部分則共享由protected成員表現(xiàn)的那部分實(shí)現(xiàn)(implementation)。
這不是一件容易的事情:確定哪些實(shí)現(xiàn)部分是對(duì)所有的派生類都有用的,并將之共享出來。因此,與public接口相比,protected成員往往要做多得多的改動(dòng)。舉例來說,雖然理論上“中心”(center)對(duì)所有的圖形都是一個(gè)有效的概念,但當(dāng)你要維護(hù)一個(gè)三角形的“中心”的時(shí)候,是一件非常麻煩的事情——對(duì)于三角形,當(dāng)且僅當(dāng)它確實(shí)被需要的時(shí)候,計(jì)算這個(gè)中心才是有意義的。
protected成員很可能要依賴于實(shí)現(xiàn)部分的細(xì)節(jié),而Shape的用戶(譯注:user此處譯為用戶,指使用Shape類的代碼,下同)卻不見得必須依賴它們。舉例來說,很多(大多數(shù)?)使用Shape的代碼在邏輯上是與“顏色”無關(guān)的,但是由于Shape中“顏色”這個(gè)定義的存在,卻可能需要一堆復(fù)雜的頭文件,來結(jié)合操作系統(tǒng)的顏色概念。
當(dāng)protected部分發(fā)生了改變時(shí),使用Shape的代碼必須重新編譯——即使只有派生類的實(shí)現(xiàn)部分才能夠訪問protected成員。
于是,基類中的“實(shí)現(xiàn)相關(guān)的信息”(information helpful to implementers)對(duì)用戶來說變成了象接口一樣敏感的東西,它的存在導(dǎo)致了實(shí)現(xiàn)部分的不穩(wěn)定,用戶代碼的無謂的重編譯(當(dāng)實(shí)現(xiàn)部分發(fā)生改變時(shí)),以及將頭文件無節(jié)制地包含進(jìn)用戶代碼中(因?yàn)椤皩?shí)現(xiàn)相關(guān)的信息”需要它們)。有時(shí)這被稱為“脆弱的基類問題”(brittle base class problem)。

