【发布时间】:2010-11-08 10:13:39
【问题描述】:
我正在玩弄一个应用程序,粗略地说,它是一种用于建筑行业的建模器应用程序。将来我希望用户可以同时使用 SI 单位和英制单位。据我了解,在美国建筑业中,在指定尺寸时习惯使用英寸的分数,例如 3 1/2" - 而在国际单位制中,我们会写 3.5,而不是 3 1/2。我正在寻找一种方法在我的软件中使用这些不同的系统 - 存储它们,对它们进行计算等,不仅解析用户输入的内容。它应该能够以他输入的方式向用户显示测量,但能够计算其他测量值 - 例如将 3 厘米添加到 1 1/2 英寸。因此,如果用户绘制 5 英尺的墙壁长度和 3 米的另一面,则总测量值应以用户选择的默认单位系统显示。
我还没有决定我应该为用户输入数据增加多少灵活性;例如如果他输入 1 英尺 14 英寸,下次显示测量值时应该是 2 英尺 2 英寸吗?但是,在我做出这样的决定之前,我正在寻找一种以精确形式存储测量值的方法,这就是我的问题所在。
我正在使用 C++,并且查看了 Boost.Units,但这似乎没有提供处理分数的方法。
简单的选择是将所有内容都转换为毫米,但舍入误差会导致无法返回到用户输入的精确测量值(如果他以英制测量值输入)。所以我需要一些更复杂的东西。
现在我正在使用一个暂定名为“距离”的类,在概念上看起来像这样:
class Distance
{
public:
Distance(double value);
// operators +, -, *, /
Distance operator+(const Distance& that);
...etc...
std::string StringForm(); // Returns a textual form of the value
Distance operator=(double value);
private:
<question: what should go here?>
}
这清楚地表明了我的问题所在。最明显的做法是有一个枚举,说明此距离是存储 SI 单位还是英制单位,并具有存储米、厘米和毫米(如果是 SI 单位)和英尺和英寸(如果这是帝国的。然而,这将使类的实现充满 if(SI) else ...,并且非常浪费内存。另外,例如,我必须存储英尺和英寸的分子和分母才能准确存储 1/3"。
因此,鉴于我的设计要求,我正在寻找有关如何解决这些问题的一般设计建议。当然,如果有一个 C++ 库已经可以做这些事情,或者我可以查看其他语言的库来复制概念,那就太好了。
【问题讨论】:
-
如果您决定使用分数,请查看stackoverflow.com/questions/648778/…
-
一个很好的信息来源,用于处理同一域内的单元(即宽度 * 高度 = 面积)然后看看:learningcppisfun.blogspot.com/2007/01/…。