分析模式-计量的C++实现——回复ch0877

原创 2002年07月19日 09:47:00

ch0877翻译了一篇名叫《分析模式-计量》的文章(http://www.csdn.net/Develop/article/14/14449.shtm),很不错。我就试着用C++实现了一下。

以下是源代码:

#ifndef _QUANTITY_H_
#define _QUANTITY_H_

#include <crtdbg.h>

template<typename ValueType>
class Quantity
{
public:
 template<typename UnitType>Weight(const ValueType & amount, const UnitType & unit)
  : m_amount(amount), m_unit(new unit_wrap<UnitType, ValueType>(unit))
 {
 }
 ~Quantity()
 {
  delete m_unit;
 }
 Quantity(const Quantity & other)
  : m_amount(other.m_amount), m_unit(other.m_unit ? other.m_unit->clone() : 0)
 {
 }
 Quantity & operator=(const Quantity & rhs)
 {
  if(&rhs == this)
   return *this;
  m_amount = rhs.m_amount;
  delete m_unit;
  m_unit = rhs.m_unit ? rhs.m_unit->clone() : 0;
  return *this;
 }
 template<typename UnitType> void convert(const UnitType & new_unit)
 {
  _ASSERT(m_unit);
  m_amount = m_unit->to_standard(m_amount);
  delete m_unit;
  m_unit = new unit_wrap<UnitType, double>(new_unit);
  m_amount = m_unit->from_standard(m_amount);
 }
 Quantity & operator+=(const Quantity & rhs)
 {
  _ASSERT(m_unit);
  _ASSERT(rhs.m_unit);
  m_amount = m_unit->from_standard(
   m_unit->to_standard(m_amount) + rhs.m_unit->to_standard(rhs.m_amount) );
  return *this;
 }
 Quantity & operator-=(const Quantity & rhs)
 {
  _ASSERT(m_unit);
  _ASSERT(rhs.m_unit);
  m_amount = m_unit->from_standard(
   m_unit->to_standard(m_amount) - rhs.m_unit->to_standard(rhs.m_amount) );
  return *this;
 }
 bool operator==(const Quantity & rhs)
 {
  _ASSERT(m_unit);
  _ASSERT(rhs.m_unit);
  return equal(m_unit->to_standard(m_amount) , rhs.m_unit->to_standard(rhs.m_amount) );
 }
 bool operator>(const Quantity & rhs)
 {
  _ASSERT(m_unit);
  _ASSERT(rhs.m_unit);
  return (m_unit->to_standard(m_amount) > rhs.m_unit->to_standard(rhs.m_amount) );
 }

private:
 template<typename T>bool equal(const T & l, const T & r)
 {return (l == r);}
 template<>bool equal<double>(const double & l, const double & r)
 {
  static double precision = 0.000000001;
  return (l - r < precision);
 }

private:
 template<typename ValueType>
 class unit_base
 {
 public:
  virtual ~unit_base()
  {
  }
 public:
  virtual unit_base * clone() const = 0;
  virtual ValueType to_standard(const ValueType & val) const = 0;
  virtual ValueType from_standard(const ValueType & val) const = 0;
 };
 template<typename UnitType, typename ValueType>
 class unit_wrap : public unit_base<ValueType>
 {
 public:
  unit_wrap(const UnitType & unit) : m_content(unit)
  {
  }
 public:
  virtual unit_base<ValueType> * clone() const
  {
   return new unit_wrap(m_content);
  }
  virtual ValueType to_standard(const ValueType & val) const
  {
   return m_content.to_standard(val);
  }
  virtual ValueType from_standard(const ValueType & val) const
  {
   return m_content.from_standard(val);
  }
 private:
  UnitType m_content;
 };

private:
 ValueType    m_amount;
 unit_base<ValueType> * m_unit;
};

template<typename ValueType>
Quantity<ValueType> inline _cdecl operator+(const Quantity<ValueType> & a,
           const Quantity<ValueType> & b)
{return (Quantity<ValueType>(a)+=b);}

template<typename ValueType>
Quantity<ValueType> inline _cdecl operator-(const Quantity<ValueType> & a, const Quantity<ValueType> & b)
{return (Quantity<ValueType>(a)-=b);}


#endif /* _QUANTITY_H_ */

以下是示例代码:

typedef Quantity<double> Weight;
class UNIT_KG
{
public:
 double to_standard(double val) const
 {return val;}
 double from_standard(double val) const
 {return val;}
};

class UNIT_G
{
public:
 double to_standard(double val) const
 {return val/1000.0;}
 double from_standard(double val) const
 {return val*1000.0;}
};

UNIT_KG _kg;
UNIT_G _g;

 Weight w1(1.0, _kg);
 Weight w2(1.0, _g);
 w1.convert(_g);
 w1.convert(_kg);
 w2 = w1;
 Weight w10(1.0, _kg);
 Weight w20(500.0, _g);
 w10 +=  w20;
 Weight w30(w10 + w20);
 bool b = (w10 == w20);
 b = (w30 > w10);

分析模式-计量的C++实现——完美版本

以下是http://www.csdn.net/develop/Article/14/14487.shtm的一个改进版本,本来是作为评论附在上一篇文章后面的,但是作为评论发表的话,会丢失很多文字,很奇怪...
  • noho
  • noho
  • 2002年07月23日 09:11
  • 617

如何用R做计量经济学

CRAN任务视图:计量经济学 线形回归模型(Linear regression models) ž   线形模型可用stats包中lm()函数通过OLS来拟合,该包中也有各种检验方法用来比...
  • s04023083
  • s04023083
  • 2014年10月22日 16:06
  • 6438

php 无线级别分类 实现评论回复功能

header('Content-type:text/html; charset=utf-8'); echo $_SERVER["REMOTE_ADDR"]."";   $sip=substr($_...
  • qq1355541448
  • qq1355541448
  • 2013年10月22日 11:16
  • 6361

php无限级分类实现评论及回复

经常在各大论坛或新闻板块详情页面下边看到评论功能,可以直接发表评论内容,可以对别人的评论进行回复,别人又可以对你的回复再次评论或回复,如此反复,理论上可以说是没有休止,从技术角度分析很容易想到运用无限...
  • Jo_Andy
  • Jo_Andy
  • 2015年05月18日 13:46
  • 14160

reactor模式C++实现

copy from github上的一份实现。。。找不到链接了。。。 感觉epoll主要负责fd到event类型的映射,而reactor模式管理fd event类型 eventhandler具体...
  • u011693064
  • u011693064
  • 2017年05月11日 14:28
  • 380

LL(1)分析法_C++实现

Code by C++#include #include #include /*******************************************/int count=0; ...
  • shaguabufadai
  • shaguabufadai
  • 2017年05月28日 23:41
  • 382

电力企业计量生产需求系统解决方案

某电网公司开发计量生产监控系统,通过此平台负责统一协调和安排检定生产基地的智能库房和检定流水线设备,实现计量装置检定过程的自动化流水线式生产。 计量生产监控系统通过建设覆盖计量全生命周期的质量监控体系...
  • yuanziok
  • yuanziok
  • 2015年12月23日 14:15
  • 1794

命令模式—C++实现撤消重做

Command结构 意图 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。 适用性 1、抽象出待执行的动作以参数化某对象,你可用...
  • wcl0617
  • wcl0617
  • 2017年11月22日 14:25
  • 169

储罐自动计量系统

0 系统概述 油罐计量系统是采用国际上公认的“混合法”质量计量方法研制的油罐自动质量计量监管信息系统。该系统以高精度液位仪为核心的,配合以罗斯蒙特高精度差压变送器,结合自动计量系统实现全自动的油...
  • leiyin333
  • leiyin333
  • 2017年08月11日 10:43
  • 221

程序性能的初步优化与分析(以 C++ 为例)

去年圣诞节浏览了 Milo Yip 的文章 “如何用 C 语言画一棵圣诞树” 后,对这个圣诞树生成算法很感兴趣。 下面对这个程序,做一些简单的优化分析......
  • andytimes
  • andytimes
  • 2016年06月09日 02:59
  • 670
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分析模式-计量的C++实现——回复ch0877
举报原因:
原因补充:

(最多只允许输入30个字)