我希望使用名称和单位的双值,但我想使用它们就好像它们是简单的双打一样。例如,我想像这样使用它们:
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:万一你想知道,目前我不关心在计算时检查单位。
答案 0 :(得分:2)
任务操作员完全没问题。唯一不同寻常的是你没有返回对象,因此操作员调用无法链接。否则,它是一个完全正常的操作员。