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