需求:
1)安全技術安全的需要。即使核心實現封閉在庫中不可見,但是標頭檔中的變數定義仍然會曝露一些內部資訊;
2)節省編譯時間的需要。在開發設計初期,實現部分需要經常變動,連標頭檔中變數定義也需要經常變動,因此在重編譯的時候標頭檔也需要編譯,有時候導致編譯時間過長。
方案:
控制代碼類可解決上述問題:
//:HANDLE.H -- Handle Classes
#ifndef HANDLE_H_
#define HANDLE_H_
class handle {
struct cheshire; // Class declaration only
cheshire* smile;
public:
handle( );
void doit( );
~handle( );
};
#endif // HANDLE_H_
這是所有客戶程式員都能看到的,其中struct cheshire是沒有完全指定的類型說明或類說明,將用來存放真正的變數。它告訴編譯器, cheshire是一個結構的名字,但沒有提供有關該結構的任何東西。這對產生一個指向結構的指標來說意見足夠了。
在這種技術中,包含具體實現的結構主體被隱藏在實現檔案中。
//:HANDLE.CPP -- Handle implementation
#include "handle.h"
//Define handle's implementation
struct handle:cheshire {
int i;
};
handle::handle() {
smile=(cheshire*)malloc(sizeof(cheshire));
smile->i=0;
}
void handle::doit() {
//do something with i
}
handle::~handle() {
free(smile);
}
控制代碼類的使用就像任何類的使用一樣,包括標頭檔,建立對象,發送資訊。但是通過這樣的設計,即隱藏了變數的設計,也使得實現作變動時無需重編譯標頭檔。Bruce說雖然這並不是完美的資訊隱蔽,但畢竟是一大進步。