逻辑比较运算符

时间:2012-07-17 14:26:51

标签: c++ oop function error-handling operator-overloading

这是我的逻辑比较运算符(==)重载的代码。我用它来检查两个字符串的大小和内容是否相同。否则它应该返回false。

 bool MyString::operator==(const MyString& other)const
 {
    if(other.Size == this->Size)
    {
        for(int i = 0; i < this->Size+1; i++)
        {
            if(&other == this)                          
                  return true;            
        }
    }
    else
        return false;
 }

当我运行valgrind时,它告诉我警告控制到达非void函数的结束。有关如何解决此问题的建议以及我可以采取哪些措施来改进代码?

4 个答案:

答案 0 :(得分:3)

当控件到达for循环的末尾时,您会立即到达函数的末尾而不返回值。

在我看来,无论如何你在for循环中都有逻辑 - 它正在将另一项的地址与此进行比较。虽然这样做很好,但你只需要做一次,而不是循环。

在循环中,你无疑要比较字符串中的字符,而不是对象的地址。

编辑:

典型的实施方式是这个一般的顺序:

class MyString { 
    char *data;
    size_t length;
public:
    // ...
    bool operator==(MyString const &other) const {
        if (length != other.length)
            return false;
        for (int i=0; i<length; i++)
            if (data[i] != other.data[i]) // If we see any inequality
                return false;             //     they're not equal
        return true;                      // all equal, so the strings are equal.
    }
};

答案 1 :(得分:1)

如果尺寸相等,那么什么决定平等并不太清楚,但是 循环表明你正在寻找类似的东西:

bool
MyString::operator==( MyString const& other ) const
{
    return size == other.size && std::equals( ??? );
}

答案 2 :(得分:1)

首先,如果您输入for循环,并且条件&other == this将无法满足,您将永远不会返回任何内容。要解决此问题,您应该删除else语句。如果未满足other.Size == this->Size条件,或者您已经完成整个循环并且未在其中使用return,这将导致函数返回false。

第二个问题是第if(&other == this)行。我相信在循环内部你打算检查字符串的所有符号。但现在你只是检查指向类本身的指针。要检查字符,您需要使用类似if( other->data == this->data )的内容,前提是您有一个data成员,您可以在其中存储...数据(对于重言式抱歉)。

另一个小流程在于设计。你看,要检查字符串 是否相等,你需要查看每个字符并检查它们是否匹配。但是,要证明字符串相等,您只需找到一对不匹配的字符。在那之后,继续比较是没有意义的。因此,最好将周期中的条件改为负值,以便在你完成一对不匹配之后立即停止比较,而不是对其他角色进行无用的比较。

通常,尽可能快地返回所有错误并避免不必要的问题是一种很好的做法。因此,如果您可以通过简单的检查在功能的开头检查一些内容,那么最好这样做。

毕竟,你应该有这样的东西:

bool MyString::operator==(const MyString& other)const
{
   if(other.Size != this->Size)
       return false;//If the sizes do not match, no need to check anything else. Just return false.

   //If we are here, the sizes match. Lets check the characters.
   for(int i = 0; i < this->Size+1; i++)
   {
       //If some pair doesnt match, the strings are not equal, and we exit.
       if( other->data[i] != this->data[i])                          
                  return false;
   }

   //If we are here, all the characters did match, so we return true.
   return true;
}

答案 3 :(得分:0)

摆脱else。这样,如果不满足条件,则返回false的“默认”行为。这是你想要的功能,编译器或语法检查器不会抱怨。