我有一个类来表示整数,我想区分lbs和kg,我该怎么做?

问题描述:

我正在考虑为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

就我个人而言,我会有一个名为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

为什么不创建一个获得整数(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); 
}