我正在尝试使用模仿stl类的类模板。我正在尝试将货币类作为一种新类型来更好地处理我们系统中的货币。
这是我实验的一个非常粗略的草稿:
template <class T> class CURRENCY
{
private:
int p_iDollars;
int p_iCents;
int p_iPrecision = pow(10, 5);
public:
CURRENCY(T dStartingValue)
{
int p = this->p_iPrecision;
double temp_dStartingValue = dStartingValue * p;
this->p_iDollars = temp_dStartingValue / p;
this->p_iCents = (dStartingValue - this->p_iDollars) * p;
}
CURRENCY operator+(T value)
{
this->p_iDollars = ((double) val()) + value;
}
CURRENCY operator-(T value)
{
this->p_iDollars = ((double) val()) - value;
}
CURRENCY operator*(T value)
{
this->p_iDollars = ((double) val()) * value;
}
CURRENCY operator/(T value)
{
this->p_iDollars = ((double) val()) / value;
}
CURRENCY operator= (int value)
{
this->p_iDollars = value;
}
double val()
{
return this->p_iDollars + ((double) this->p_iCents / this->p_iPrecision);
}
int dollars()
{
return this->p_iDollars;
}
int cents()
{
return this->p_iCents;
}
};
我希望能够将此类实现为类似的类型:
typedef CURRENCY<double> money;
int main()
{
money m = 3.141592653589;
m = m + 30; // added assignment operator here
cout << m << endl;
return 0;
}
我想我不确定如何甚至说出我所描述的内容而不是我想要返回我对象的当前“值”,因为知道该对象并不真正拥有 a值。我不确定如何允许我的类携带一个可以返回和操作的默认表示值。
在这种情况下,我希望cout << m << endl;
返回“新”值:33.1416
。
任何方向都会有所帮助,因为我只是想绕过这个概念。 注意:这段代码是超级不完整的,并不是为了完全正常运行,因为我正在进行实验,但请随时纠正任何逻辑问题或我的方向
我是个笨蛋,并没有包括上面的任务......
答案 0 :(得分:2)
首先,+
和类似的运算符实际上并没有修改操作中涉及的对象,这意味着你必须创建一个新的对象,然后从运算符函数返回。
像
这样的东西CURRENCY operator+(T value)
{
CURRENCY temp(*this);
temp.p_iDollars += value;
return temp;
}
答案 1 :(得分:1)
require 'sprockets/rails/task'
Sprockets::Rails::Task.new(Rails.application) do |t|
t.environment = lambda { Rails.application.assets }
t.assets = %w( application.js application.css )
t.keep = 5
end
设置operator +,operator /等修改调用对象也是非常糟糕的设计。这些不应该是成员函数,不应该修改调用对象。而是创建传递的CURRENCY的副本,修改它并返回它。