-1

这是我的逻辑比较运算符(==)重载的代码。我用它来检查两个字符串的大小和内容是否相同。否则它应该返回 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 时,它告诉我警告控制到达非空函数的末尾。有关如何解决此问题以及我可以做些什么来改进代码的任何建议?

4

4 回答 4

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.
    }
};
于 2012-07-17T14:31:43.843 回答
1

如果大小相等,尚不清楚是什么决定了相等,但循环表明您正在寻找类似的东西:

bool
MyString::operator==( MyString const& other ) const
{
    return size == other.size && std::equals( ??? );
}
于 2012-07-17T14:36:28.337 回答
1

好吧,首先,如果你进入for循环,并且条件&other == this不会被满足,你将永远不会返回任何东西。要解决此问题,您应该删除该else语句。other.Size == this->Size如果条件不满足,或者您已经完成了整个循环并且没有在其中使用,这将导致您的函数返回 false return

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

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

一般来说,最好尽快返回所有错误并避免不必要的计算。因此,如果您可以通过简单的检查在函数开始时检查某些内容,那么最好这样做。

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

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;
}
于 2012-07-17T15:47:17.870 回答
0

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

于 2012-07-17T14:31:50.373 回答