2012-03-16 38 views
1

我正在考慮爲kg和一個單獨的類創建一個類,這兩個類都從整數繼承,但不向其中添加任何內容。這將允許編譯器驗證正確的單元傳遞給函數。我有一個類來表示整數,我想區分lbs和kg,我該怎麼做?

這是最好的方法還是有更好的方法來做到這一點?

+2

你可以考慮[Boost.Units(http://www.boost.org/doc/libs/1_49_0/doc/html/boost_units.html#boost_units.Introduction)。 – 2012-03-16 17:44:32

回答

4

就我個人而言,我會有一個名爲Mass或類似的類,並有方法將返回對象的值在一個單位或另一個單位。

class Mass 
{ 
public: 
    Mass() 
    : mMassKG(0) {} 
    ~Mass() {} 

    int kilograms() const { return mMassKG; } 
    int pounds() const { return mMassKG * 2.2; } 

    void setKilograms(int kg) { mMassKG = kg; } 
    void setPounds(int lbs) { mMassKG = lbs/2.2; } 

private: 
    int mMassKG; 
}; 
+0

這是不對稱的,因爲你可以在兩個單位中獲得,但你不能在兩個單位中設置。 – 2012-03-16 17:50:25

+0

@OliCharlesworth確實如此,但我認爲它更像一個概念性的例子,而不是一個功能性的類。我爲對稱添加了setters。如果您主要存儲磅的整數值,我還會說使用整數公斤作爲內部表示並不是最佳選擇。 – sbooth 2012-03-16 17:54:48

+0

'mass1.setKilograms(mass2.pounds())'是OP想要禁止的。 – molbdnilo 2012-03-16 22:00:51

0

爲什麼不創建一個獲得整數(setter)並返回getKg或getLbs方法的類?

0

你可以舉一個你需要的函數種類的例子。根據你需要什麼,你可能會更好做了磅和公斤如

public void doXlbs() { 
    ... 
} 

public void doXkgs() { 
    ... 
} 
0

徹底未經檢驗的,但這樣的事情可能的技巧,並提供合理的不同方法調用類型安全:

template<typename T> 
class Unit 
{ 
public: 
    explicit Unit(float size) : m_size(size) {} 
    float size() const { return m_size; } 
    Unit operator += (Unit rhs) { m_size += rhs.size(); return *this; } 
private: 
    float m_size; 
}; 

template<typename T> 
Unit<T> operator+ (Unit<T> lhs, Unit<T> rhs) 
{ 
    return lhs += rhs; 
} 
// Plus more useful operators that you need... 

struct Kg {}; 
struct Lb {}; 

typedef Unit<Kg> Kilograms; 
typedef Unit<Lb> Pounds; 

Kilograms lbToKg(Pounds lb) 
{ 
    return Kilograms(lb.size()/2.2); 
} 

Pounds kgToLb(Kilograms kg) 
{ 
    return Pounds(kg.size() * 2.2); 
} 
相關問題