#include"stdafx.h"
#include<iostream>
class Item
{
int exponent;
double coefficient; //two private members
public:
//constructor
Item(int exp = 0, int coef = 0) :exponent(exp), coefficient(coef) {}
Item(Item& item) {
exponent = item.exponent;
coefficient = item.coefficient;
} //copy constructor
//interface to change private member exponent
void change_exp(const int n) {
Item::exponent = n;
}
//interface to change private member coefficient
void change_coef(const double n) {
Item::coefficient = n;
}
int get_exp() { return exponent; }// interface to get exponent
double get_coef() { return coefficient; }// interface to get coefficient
~Item() {}
Item operator=(Item item2) {
change_exp(item2.get_exp());
change_coef(item2.get_coef());
return (*this);
}
Item operator*(Item & item2) {
Item result;
result.change_coef(coefficient * item2.get_coef());
result.change_exp(exponent + item2.get_exp());
return result;
}
};
int main() {
Item test(2, 7);
Item test2(4, 5);
Item result;
result = test * test2; //BUG!!!
return 0;
}
该错误出现在行评论BUG上
错误C2679二进制'=':找不到哪个操作符带有'Item'类型的右操作数(或者没有可接受的转换)
当我只分配一个对象时
结果=测试;
没事。
我不知道我的=重载函数出了什么问题。
请帮忙......
答案 0 :(得分:1)
您需要将复制构造函数声明为Item(const Item& item)
。
test * test2
的结果是没有地址的临时右值,因此您无法创建(左值)引用。但是,允许创建const引用。
此问题和答案可能会产生与此主题相关的更多信息:c++: const reference to an rvalue
答案 1 :(得分:0)
你的代码有很多问题。
首先,您应该尊重诸如accessor和mutator方法之类的命名约定。您应该将访问者方法命名为 setExp 而不是 change_exp 。
其次,你应该知道什么时候重载像赋值运算符这样的东西(请谷歌 c ++中的三巨头)。基本上,如果您只有原始类型的字段,则不必重载赋值运算符。
最后,您必须尽可能使用 const 限定符。例如,在访问器方法的末尾,在复制构造函数的参数前面等。
您的复制构造函数应该看起来像
Item(const Item& item) {
exponent = item.exponent;
coefficient = item.coefficient;
}
您的赋值运算符应该类似于
Item& operator=(const Item& item2) {
change_exp(item2.get_exp());
change_coef(item2.get_coef());
return (*this);
}
字段系数的访问器方法看起来像
double getCoefficient() const { return coefficient; }// interface to get coefficient