標籤:標準 private begin noi 標準輸出 改進 第一個 oid 情況
C++面對對象設計其中常常涉及到有關跟蹤輸出的功能,這是C++進階的一個非常基礎的問題;
以下範例將實現這一功能;
class Trace {
public:
Trace() { noisy = 0; }
void print(char *s) { if(noisy) printf("%s", s); }
void on() { noisy = 1; }
void off() { noisy = 0; }
private:
int noisy;
};
上述範例中用一個noisy跟蹤輸出;
另外,因為這些成員函數定義在Trace類自身的定義內,C++會內聯擴充它們。所以就使得即使在不進行跟蹤的情況下。在程式中保留Trace類的對象也不必付出多大的代價,。僅僅要讓print函數不做不論什麼事情,然後又一次編譯器,就能夠有效關閉全部對象的輸出;
還有一種改進:
在面對對象時,使用者總是要求改動程式;比方說。涉及檔案輸入輸出資料流。將要輸出的檔案列印到標準輸出裝置以外的東西上;
class Trace {
public:
Trace() { noisy = 0; f = stdout; }
Trace(FILE *ff) { noisy = 0; f = ff; }
void print(char *s) { if(noisy) fprintf(f, "%s", s); }
void on() { noisy = 1; }
void off() { noisy = 0; }
private:
int noisy;
FILE *f;
};
Trace類中有兩個建構函式。第一個是無參數的建構函式,其對象的成員f為stdout,因此輸出到stdout。還有一個建構函式同意明白指定輸出檔案!
完整程式:
#include <stdio.h>
class Trace {
public:
Trace() { noisy = 0; f = stdout; }
Trace(FILE *ff) { noisy = 0; f = ff; }
void print(char *s) { if(noisy) fprintf(f, "%s", s); }
void on() { noisy = 1; }
void off() { noisy = 0; }
private:
int noisy;
FILE *f;
};
int main()
{
Trace t(stderr);
t.print("begin main()\n");
t.print("end main()\n");
}
C++ 進階