C++过载问题

C++ Overloading issue

本文关键字:问题 C++      更新时间:2023-10-16

这是我第一次尝试在c++中重载(当然还在学习),我不太确定为什么这段代码会出错?

bool operator<= (Vector3 v) {
    if (x <= v.x) && (y <= v.y) && (z <= v.z) {
        return true;
    }
}

错误是

19 |错误:在"("标记|之前需要标识符

19|错误:应为";"在"("标记|之前

我搜索了这两个,发现第一个是函数之外的代码(事实并非如此),但在第二个上没有找到任何内容。

感谢阅读

除了运算符的逻辑之外,if中似乎缺少一组括号。这在语法上是正确的:

if ( (x <= v.x) && (y <= v.y) && (z <= v.z) )

但你真正应该做的是简化整个过程,避免不必要的if:

bool operator<= (Vector3 v) {
    return (x <= v.x) && (y <= v.y) && (z <= v.z);
}

最后,比较成员函数应该是const,因为在比较时修改某些内容是没有意义的。此外,您可能希望通过引用传递参数,尽管这取决于Vector的大小和复制成本。

bool operator<= (const Vector3& v) const
{
    return (x <= v.x) && (y <= v.y) && (z <= v.z);
}

还添加了其他答案,如果不为true,您的语句会返回什么,c++默认不返回任何内容,这就是为什么最好返回操作结果

return (x <= v.x) && (y <= v.y) && (z <= v.z);

if语句中的条件应括在括号中。因此,有效的if语句将看起来像

if ( (x <= v.x) && (y <= v.y) && (z <= v.z) ) {

此外,最好以以下方式定义操作员

bool operator <=( const Vector3 &v ) const 
{
    return ( ( x <= v.x ) && ( y <= v.y ) && ( z <= v.z ) );
}

注意:您可能会考虑这个:

inline bool operator<= (const3 Vector& u, const Vector3& v) {
    if(u.x < v.x) return true;
    if(u.x == v.x) {
       if(u.y < v.y) return true;
       if(u.y == v.y) {
          if(u.z <= v.z) return true;
       }
    }
    return false;
}

这里有一个独立的二进制函数,它通过常量引用获取参数,以避免不必要的复制。逻辑也发生了变化(x的秩比y高,y的秩比z高)。这使得[1,1,1]小于[1,1,2](在您的逻辑中不是这样)。