2

我在重载比较运算符><. 我尝试了两种不同的方法,但我仍然遇到问题。

bool Car::operator ==(const Car &car)
{
    return mLNumber == car.GetNum();
}

bool Car::operator <(const Car &carB)
{
    return mLNumber < carB.GetNum(); 
}
bool Car::operator >(const Car &carB)
{
    return mLNumber > carB.GetNum(); 
}
int Car::GetNum()
{
    return mLNumber;
}

我的==操作员工作得很好。我得到这些运算符不存在的错误。这是我的第二次尝试。

bool Car::operator <(const Car &carA, const Car &carB)
{
    return carA.GetNum() < carB.GetNum(); 
}
bool Car::operator >(const Car &carB)
{
    return carA.GetNum() > carB.GetNum(); 
}

我得到参数太多的错误。我也明白了:

'Car::GetNum' : cannot convert 'this' pointer from 'const Car' to 'Car &' 
4

6 回答 6

6

尝试让您的运营商const

bool Car::operator <(const Car &carB) const {
    return mLNumber < carB.GetNum(); 
}
bool Car::operator >(const Car &carB) const {
    return mLNumber > carB.GetNum(); 
}

编辑:在这种情况下,您也应该制作该GetNum()函数,const因为您是在const Car&对象上调用它。

你也不需要GetNum(),你可以写

bool Car::operator <(const Car &carB) const {
    return mLNumber < carB.mLNumber; 
}
于 2012-10-25T20:18:02.087 回答
3

代码中有两个问题 -首先,从逻辑上讲,您的运算符在类型上是不可变的 - 它们不会更改对象,它们只分析它们,并且您应该能够在不可变 ( const) 对象上调用它们。因此,正如alestanis 指出的那样,制作它们const(所有运算符和getter 方法)。

其次< ==>是二元运算符。实现它们有两种选择:作为自由运营商或作为成员。你和会员一起去,这没关系,但是:

bool Car::operator <(const Car &carA, const Car &carB)

没有声明二元运算符。当您将运算符实现为成员时,第一个参数隐式为当前对象(*this),所以它应该是

bool Car::operator <(const Car &carB) const

自由运算符看起来像:

bool operator < (const Car& carA, const Car& carB);

请注意,const这没有意义,因为它不是成员。但是,请注意,第一个参数 ( carA) 被标记为 const,它对应于const应用于成员版本中的方法(在后台,标记thisconst)。

于 2012-10-25T20:24:37.650 回答
1

查看您在哪里调用这些运算符会有所帮助。

您的带有两个 Car 参数的第二个版本应该是全局运算符。所以如果你使用 Car:: 从定义中删除它们。也将声明移出 Car 类的主体。

由于您在 const Car 对象上调用 GetNum,因此 Car::GetNum 函数也需要为 const。更肮脏的方法是抛弃 const-ness,但这是不受欢迎的。

于 2012-10-25T20:20:27.743 回答
1

在第一种情况下:

您的运算符不会更改操作数的数据,则应将其设为 const:

bool Car::operator <(const Car &carB) const {
                                    //^^^^^
    return mLNumber < carB.GetNum(); 
}
bool Car::operator >(const Car &carB) const {
                                   // ^^^^^
    return mLNumber > carB.GetNum(); 
}

int Car::GetNum() const
                //^^^^^
{
    return mLNumber;
}

在第二种情况下,当运算符接受 2 个参数时,它们应该被实现为自由函数:

bool operator <(const Car &carA, const Car &carB)
{
    return carA.GetNum() < carB.GetNum(); 
}
bool operator >(const Car &carA, const Car &carB)
{
    return carA.GetNum() > carB.GetNum(); 
}
于 2012-10-25T20:21:15.750 回答
1

您的错误是当您想要比较一个const对象并且您的运算符未标记为时const,作为一般规则,您应该始终将不会更改您的对象的函数和运算符标记为const,这让生活变得更加轻松。例如:

bool Car::operator ==(const Car &car) const // <-- This function is const
{
    return mLNumber == car.GetNum();
}
于 2012-10-25T20:21:15.733 回答
1

问题是它car::GetNum()没有被声明const,所以你不能constcar. 运算符将 aconst Car &carB作为参数,因此您不能调用GetNum()on carB,因为carB它是一个const对象,但GetNum()尚未声明const

您应该养成将所有不修改对象的函数声明为const. 要将函数声明为const,只需const在右括号后附加即可。无论是在声明中,还是在定义中。例如:

class car {
    // ...
    void car::foo() const;
    // ...
};

void car::foo() const
{ /* ... */ }

或者,如果您在类声明中内联定义它:

class car {
    // ...
    void car::foo() const
    { /* ... */ }
    // ...
};

虽然在这种特殊情况下不是绝对必要的(这意味着这不是代码无法编译的原因),但也应该const出于同样的原因声明运算符本身(以便您也可以在const对象上使用它们。)

于 2012-10-25T20:21:26.307 回答