有時,一個類想跟蹤它有多少個對象存在。一個簡單的方法是創(chuàng)建一個靜態(tài)類成員來統(tǒng)計(jì)對象的個數(shù)。這個成員被初始化為0,在構(gòu)造函數(shù)里加 1,析構(gòu)函數(shù)里減1。(條款m26里說明了如何把這種方法封裝起來以便很容易地添加到任何類中,“my article on counting objects”提供了對這個技術(shù)的另外一些改進(jìn))
設(shè)想在一個軍事應(yīng)用程序里,有一個表示敵人目標(biāo)的類:
class enemytarget {
public:
enemytarget() { ++numtargets; }
enemytarget(const enemytarget&) { ++numtargets; }
~enemytarget() { --numtargets; }
static size_t numberoftargets()
{ return numtargets; }
virtual bool destroy(); // 摧毀enemytarget對象后
// 返回成功
private:
static size_t numtargets; // 對象計(jì)數(shù)器
};
// 類的靜態(tài)成員要在類外定義;
// 缺省初始化為0
size_t enemytarget::numtargets;
這個類不會為你贏得一份政府防御合同,它離國防部的要求相差太遠(yuǎn)了,但它足以滿足我們這兒說明問題的需要。
敵人的坦克是一種特殊的敵人目標(biāo),所以會很自然地想到將它抽象為一個以公有繼承方式從enemytarget派生出來的類(參見條款35及m33)。因?yàn)椴坏P(guān)心敵人目標(biāo)的總數(shù),也要關(guān)心敵人坦克的總數(shù),所以和基類一樣,在派生類里也采用了上面提到的同樣的技巧:
class enemytank: public enemytarget {
public:
enemytank() { ++numtanks; }
enemytank(const enemytank& rhs)
: enemytarget(rhs)
{ ++numtanks; }
~enemytank() { --numtanks; }
static size_t numberoftanks()
{ return numtanks; }
virtual bool destroy();
private:
static size_t numtanks; // 坦克對象計(jì)數(shù)器
};
(寫完以上兩個類的代碼后,你就更能夠理解條款m26對這個問題的通用解決方案了。)
最后,假設(shè)程序的其他某處用new動態(tài)創(chuàng)建了一個enemytank對象,然后用delete刪除掉:
enemytarget *targetptr = new enemytank;
...
delete targetptr;
設(shè)想在一個軍事應(yīng)用程序里,有一個表示敵人目標(biāo)的類:
class enemytarget {
public:
enemytarget() { ++numtargets; }
enemytarget(const enemytarget&) { ++numtargets; }
~enemytarget() { --numtargets; }
static size_t numberoftargets()
{ return numtargets; }
virtual bool destroy(); // 摧毀enemytarget對象后
// 返回成功
private:
static size_t numtargets; // 對象計(jì)數(shù)器
};
// 類的靜態(tài)成員要在類外定義;
// 缺省初始化為0
size_t enemytarget::numtargets;
這個類不會為你贏得一份政府防御合同,它離國防部的要求相差太遠(yuǎn)了,但它足以滿足我們這兒說明問題的需要。
敵人的坦克是一種特殊的敵人目標(biāo),所以會很自然地想到將它抽象為一個以公有繼承方式從enemytarget派生出來的類(參見條款35及m33)。因?yàn)椴坏P(guān)心敵人目標(biāo)的總數(shù),也要關(guān)心敵人坦克的總數(shù),所以和基類一樣,在派生類里也采用了上面提到的同樣的技巧:
class enemytank: public enemytarget {
public:
enemytank() { ++numtanks; }
enemytank(const enemytank& rhs)
: enemytarget(rhs)
{ ++numtanks; }
~enemytank() { --numtanks; }
static size_t numberoftanks()
{ return numtanks; }
virtual bool destroy();
private:
static size_t numtanks; // 坦克對象計(jì)數(shù)器
};
(寫完以上兩個類的代碼后,你就更能夠理解條款m26對這個問題的通用解決方案了。)
最后,假設(shè)程序的其他某處用new動態(tài)創(chuàng)建了一個enemytank對象,然后用delete刪除掉:
enemytarget *targetptr = new enemytank;
...
delete targetptr;