我正在考慮爲kg和一個單獨的類創建一個類,這兩個類都從整數繼承,但不向其中添加任何內容。這將允許編譯器驗證正確的單元傳遞給函數。我有一個類來表示整數,我想區分lbs和kg,我該怎麼做?
這是最好的方法還是有更好的方法來做到這一點?
我正在考慮爲kg和一個單獨的類創建一個類,這兩個類都從整數繼承,但不向其中添加任何內容。這將允許編譯器驗證正確的單元傳遞給函數。我有一個類來表示整數,我想區分lbs和kg,我該怎麼做?
這是最好的方法還是有更好的方法來做到這一點?
就我個人而言,我會有一個名爲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;
};
爲什麼不創建一個獲得整數(setter)並返回getKg或getLbs方法的類?
你可以舉一個你需要的函數種類的例子。根據你需要什麼,你可能會更好做了磅和公斤如
public void doXlbs() {
...
}
和
public void doXkgs() {
...
}
徹底未經檢驗的,但這樣的事情可能的技巧,並提供合理的不同方法調用類型安全:
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);
}
你可以考慮[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