【问题标题】:= overloading doesn't work= 重载不起作用
【发布时间】:2018-04-18 07:39:06
【问题描述】:
#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出现在注释BUG的那一行 错误 C2679 二进制“=”:未找到采用“项目”类型右侧操作数的运算符(或没有可接受的转换)
当我只分配一个对象时 结果=测试; 没事。 我不知道我的 = 重载函数哪里出了问题。 请帮忙......

【问题讨论】:

标签: c++ visual-c++ operator-overloading


【解决方案1】:

您需要将您的复制构造函数声明为Item(const Item&amp; item)

test * test2 的结果是一个没有地址的临时右值,因此您无法创建对它的(左值)引用。但是,允许创建 const 引用。

这个问题和答案可能会产生与此主题相关的更多信息:c++: const reference to an rvalue

【讨论】:

    【解决方案2】:

    你的代码有很多问题。

    • 首先,您应该尊重访问器和修改器方法等命名约定。您应该将访问器方法命名为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2017-03-13
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2017-12-29
      相关资源
      最近更新 更多