【问题标题】:Cannot pass value from overloaded operator无法从重载运算符传递值
【发布时间】:2013-04-03 08:36:57
【问题描述】:

如主题中所述,我遇到了将值从重载运算符传递回主函数的问题。我已经搜索了很多但没有效果。这是我的示例运算符。返回 Matrix m 之前的行,我已将 cout 用于检查算法是否正常工作。乘法运算符也有同样的问题。

矩阵.h

class Matrix 
{
public:
...
Matrix &operator+(const Matrix &m)
... 

private:
    int x;
    int y;
    double **tab;

};

矩阵.cpp

Matrix &Matrix::operator+(const Matrix &m)
{
if(x==m.x && y==m.y)
{
    Matrix temp(x,y);
    for(int i=0;i<x;i++)
    {
        for(int j=0;j<y;j++)
        {
            temp.tab[i][j]=tab[i][j]+m.tab[i][j];
        }
    }
    cout << temp<< endl;
return temp;
}
else
{
    char er[]={"error!\n"};
    throw er;
}

}

【问题讨论】:

  • 您正在返回对局部变量的引用(temp,对 :-)。当你返回 main 时,它已经被销毁了。而是按值返回。
  • @juanchopanza 谢谢你的帮助 你是对的!我在复制构造函数中犯了一个愚蠢的错误,这就是为什么无论将什么复制到主函数,结果我的矩阵都填充了 0。

标签: c++ operator-overloading


【解决方案1】:

根本问题是加法运算符不应该返回一个引用,而是一个值:

Matrix operator+(const Matrix &m);

这适用于乘法、减法等。

除了返回对仅存在于函数范围内的变量的引用这一事实之外,返回引用在语义上也没有意义。想想这个表达式:

B + C;

如果要返回一个引用,它应该引用什么?

一种常见的做法是将Matrix&amp; operator+=(const Matrix&amp;)实现为成员运算符,然后将加法实现为非成员:

Matrix operator+(Matrix lhs, const Matrix& rhs)
{
  return lhs += rhs;
}

这使得操作对称 WRT LHS 和 RHS,允许在双方进行隐式转换。

【讨论】:

  • 感谢您的回复。你是对的,但是当我改变它时,我的问题仍然存在。现在,当我尝试在主函数中计算矩阵时,它填充了零值
  • @Norrec 那么您的代码中还有其他一些您没有向我们展示的问题。
  • @Norrec 从您发布的代码中很难看出,但您的构造函数可能有问题。
  • @juanchopanza 我将根据您的提示尝试修复此功能。至少感谢你,我知道我应该在哪里查找代码中的错误。
【解决方案2】:

简单的答案:永远不要返回对您在函数中创建的对象的引用。意思是,你的操作符应该返回一个Matrix,而不是Matrix&amp;&amp; 属于返回类型,你可能想把它放在那里让它更明显)。

如果您为 Matrix 类提供适当的移动构造函数,则返回结果时不会有昂贵的副本。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 1970-01-01
    • 2011-05-15
    • 2018-09-25
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多