2011-10-20 53 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