2011-10-20 133 views
1

我有幾種類型共享共同的行爲和相同的構造函數和操作符。一些看起來像這樣:C++區分結構相同的類

class NumberOfFingers 
{ 
public: 
    void operator=(int t) { this->value = t; } 
    operator int() const { return this->value; } 
private: 
    int value; 
}; 

NumberOfToes是相同的。

每個職業都有不同的行爲,這裏有一個例子:

std::ostream& operator<<(std::ostream &s, const NumberOfFingers &fingers) 
{ 
    s << fingers << " fingers\n"; 
} 

std::ostream& operator<<(std::ostream &s, const NumberOfFingers &toes) 
{ 
    s << toes << " toes\n"; 
} 

我怎樣才能儘量減少類定義的重複,同時又保持類類型不同?我不想讓NumberOfFingersNumberOfToes從公共基類中派生出來,因爲我失去了構造函數和運算符。我猜想一個好的答案會涉及模板。

+3

是什麼讓你覺得從一個共同的基礎,繼承會使你失去的建設者和經營者? –

+0

@Björn你在說什麼?如果派生類沒有自己的派生類,它總是可以使用基類構造函數和運算符嗎? – paperjam

回答

5

是的,你是因爲它會涉及模板:)正確

enum {FINGERS, TOES...}; 
... 
template<unsigned Type> //maybe template<enum Type> but I havent compiled this. 
class NumberOfType 
{ 
public: 
    void operator=(int t) { this->value = t; } 
    operator int() const { return this->value; } 
private: 
    int value; 
}; 
... 
typedef NumberOfType<FINGERS> NumberOfFinger 
typedef NumberOfType<TOES> NumberOfToes 
... so on and so forth. 
+3

它可能更好使用類型而不是枚舉,例如'struct fingers_tag','typedef NumberOfType NumberOfFinger'等等。這樣你不需要有一個地方指定所有可能的類型變化。 –

+0

@Konstantin這確實是非常真實的,取決於我們是否希望關閉或打開這類類型的集合。但如果我們想要保持開放的話,那肯定是一條路。 – Akanksh