2014-04-23 37 views
2

我一直在開發一個類,它允許我單獨計算任何我將擁有的類的對象。該班級應滿足以下要求:完全充足(我不需要更改任何類別的對象被計數)開發對象的通用計數器

下面,這裏是我現在擁有的一個聲明,它是什麼我瞄準:

template< typename T > 
class Countable 
{ 
public: 
    // template< typename Type > friend size_t GetNumberOfObjects(); 
//private: 
    static size_t GetNumberOfObjects(); 

protected: 
    Countable(); 
    Countable(const Countable&); 
    ~Countable(); 

private: 
    static size_t numberOfObjects; 
}; 

我們的類層次結構:

class Machine { }; 
class Tank: public Machine { }; 
class Plane: public Machine { }; 
class Ship: public Machine { }; 

我可以使用類 「可數」 的方式如下:

class Machine: public Countable<Machine> { }; 
class Tank: public Machine, public Countable<Tank> { }; 
class Plane: public Machine, public Countable<Plane> { }; 
class Ship: public Machine, public Countable<Ship> { }; 

int main() 
{ 
    Tank t; 
    Ship s; 
    Plane p; 

    cout << Countable<Machine>::GetNumberOfObjects() << endl; // total number 
    cout << Countable<Tank>::GetNumberOfObjects() << endl; // number of only tanks 
    cout << Countable<Plane>::GetNumberOfObjects() << endl; // ... 
    cout << Countable<Ship>::GetNumberOfObjects() << endl; // ... 

    return 0; 
} 

但有一個問題: 可以使用類名稱訪問GetNumberOfObjects方法: Machine :: GetNumberOfObjects()。它看起來像一切都好,但如果我嘗試使用派生類名稱:Tank :: GetNumberOfObjects()或Plain :: GetNumberOfObjects()訪問方法,它會導致編譯問題。 這似乎有點讓用戶感到困惑。 這很明顯,爲什麼會發生。

爲了避免這種情況,我做了以下操作: 將該方法放入私人部分並創建一個外部(朋友)功能。所以有唯一的方法來訪問數量的對象。

template< typename Type > 
size_t GetNumberOfObjects() 
{ 
    return Countable<Type>:: GetNumberOfObjects(); 
} 

問題是:有沒有實現的替代方案提供唯一的方法來獲得這些計數器而不使用這樣的功能?

對此的思考我明白,如果用戶使用來自Countable-class而不是public的私有繼承來創建派生類,那就沒有問題。但我不能讓他們這樣做。

任何想法?

在此先感謝,希望我的英語是可讀=)

+0

哦,問題是由於鑽石不相容造成的。得到它了。我必須仔細閱讀它才能找出它爲什麼「清楚」。 –

+2

可能有其他選擇,但你擁有的是好的,我想不出更好的東西。 –

回答

0

在這裏,您可能需要使用虛擬繼承打破曖昧通話聯繫到您的GetNumberOfObjects(),或者也可以嘗試使用類型擦除元編程模式並將有問題的功能移到公共基類中。