表达式必须是我班级中可修改的左值

时间:2014-09-27 11:51:31

标签: c++ lvalue

我知道这意味着什么,但在我的情况下,我不明白为什么我的IDE会对此大喊大叫。

Rational operator*(const Rational& that1, const Rational& that2)
{
    Rational temp(that1);
    temp.getNom() *= that2.getNom();
    temp.getDenom() *= that2.getDenom();
    return temp;
}

int Rational::getNom() const
{
    return m_iNom / gcd(m_iNom, m_iDenom);
}
int Rational::getDenom() const
{
    return m_iDenom / gcd(m_iNom, m_iDenom);
}

float Rational::gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

m_iNom& m_iDenom是Rational类中的私有数据成员。

我得到的表达必须是一个可修改的左值' at:

temp.getNom() *= that2.getNom();
temp.getDenom() *= that2.getDenom();

2 个答案:

答案 0 :(得分:1)

您不能影响函数或方法返回的值。

temp.getNom() *= that2.getNom();temp.getNom() = temp.getNom() * that2.getNom();

类似

想写2 = 2 * 3并设置2 = 5 ......没意义!

答案 1 :(得分:1)

正如编译器所说,您无法分配返回值 即使您可以分配给返回值,成员变量也不会受到影响 - 访问器返回成员变量的值,而不是实际变量。

这样做的惯用方法是首先将operator *=作为成员实施:

Rational& operator *= (const Rational& that)
{
    m_iNom *= that.m_iNom;
    m_iDenom *= that.m_iDenom;
    return *this;
}

然后使用它来实现*

Rational operator*(const Rational& that1, const Rational& that2)
{
    Rational result(that1);
    result *= that2;
    return result;
}