2012-10-25 167 views
1

我无法重载比较运算符><。我尝试了两种不同的方式,但我仍然遇到麻烦。重载比较运算符

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 &' 

回答

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; 
} 
+0

不,这不是问题。问题是'GetNum()'不是'const'。操作符本身实际上并没有被任何'const'对象调用。 –

+0

@NikosChantziaras你应该修改你的降低政策 - 这只是不完整的,没有错的。和你一样(操作符**应该是const **,+你没有处理另一个问题 - 多个参数的错误)。从我+1,因为你是第一(但仍然不完整) –

+0

这根本不解决OP的问题,这就是为什么我认为这是一个不好的答案。其他人也没有发现错误的真正原因,这实际上令人惊讶。当然,操作符应该是'const',但这不是实际的问题:-) –

1

这将有助于看到你调用这些运营商。

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

由于您在一个const Car对象上调用GetNum,Car :: GetNum函数也需要是const。更脏的方法是抛弃常量,但这是令人不悦的。

1

在第一种情况:

您的运营商不改变操作数的数据,那么它应该进行常量:

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(); 
} 
1

你的错误是,当你要比较一个const对象和你运营商没有被标记为const,作为一般规则,您应该始终标记不会将对象更改为const的函数和运算符,这会使生活变得更加轻松。例如:

bool Car::operator ==(const Car &car) const // <-- This function is const 
{ 
    return mLNumber == car.GetNum(); 
} 
1

的问题是,car::GetNum()不宣const,所以你不能把它的carconst实例。运营商采取const Car &carB作为参数,所以你不能调用carBGetNum(),因为carBconst对象,但GetNum()尚未声明const

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

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

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

或者,如果你是内联定义它的类声明中:

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

虽然不是绝对必要在这种特殊情况下(这意味着这不是为什么代码没有按”牛逼编译),运营商自己也应该为同样的原因被宣告const(这样就可以在const对象也使用它们)

2

有代码的两个问题 - 第一,LOGI cally,你的运营商是不可变的上的类型 - 他们不改变对象,他们只分析他们,你应该能够在不可变的(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(其中,在引擎盖下,将this标记为const)。

+0

这不是问题,因为这种特殊情况下的操作符不会在'const'对象上调用。真正的问题是'GetNum()'不是'const',所以它不能在'carB'对象上调用,它是'const'。 –

+1

@NikosChantziaras你读过整个答案了吗?那么“让它们成为const(所有操作符和getter方法)”部分呢?短视和只处理直接的错误是初学者的特点。所以请原谅我多走一步! –