【发布时间】:2015-10-05 14:53:42
【问题描述】:
我希望有一个带有名称和单位的双精度值,但我想将它们用作简单的双精度值。例如我想像这样使用它们:
int main(){
NamedValue a("a","m");
NamedValue b("b","m");
NamedValue c("c","m^2");
a = 3;
b = 5;
c = a*b;
std::cout << a << b << c << std::endl;
return 0;
}
输出应该是:
a = 3 m
b = 5 m
c = 15 m^2
我想出了这个解决方案:
class NamedValue {
public:
NamedValue(std::string n,std::string u) : name(n),units(u){}
const std::string name;
const std::string units;
void operator=(double v){this->value = v;}
void operator=(const NamedValue& v){this->value = v.value;}
operator double() const { return value; }
private:
double value;
};
std::ostream& operator<<(std::ostream& stream,const NamedValue& v) {
stream << v.name << " = " << (double)v << " " << v.units << std::endl;
return stream;
}
Unitl 现在它工作得很好,但我主要关心的是赋值运算符void operator=(const NamedValue& v){this->value = v.value;},它并没有完全按照人们通常对赋值运算符的期望。
我会面临什么不良后果吗?
我正在考虑诸如将对象作为参数传递之类的事情。但是,像这样的功能
NamedValue test(NamedValue x){return x;}
没有问题,因为不涉及分配(仅复制构造函数)。我错过了什么吗?还有什么需要注意的吗?
ps:以防你想知道,目前我不在乎在计算时检查单位。
【问题讨论】:
-
您为什么不尝试使用该赋值运算符,看看会发生什么?如果您不在乎
name和units未设置,那么它“有效”。但它看起来确实很奇怪。 -
@juanchopanza 我试过了,它按预期工作。但是,我尝试了它有意编写的内容(即在
c=a+b之类的表达式中),现在我想知道是否还有其他需要正常工作的赋值运算符(即真正分配完整对象而不是只是其中一个字段)可能会失败。 -
@juanchopanza 抱歉,我有点困惑:
c=a+b实际上并没有使用我所说的赋值运算符(但带有NamedValue=double的那个)。
标签: c++ operator-overloading assignment-operator