2012-07-17 194 views
-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它告诉我警告控制达到非无效功能的结束。关于如何解决这个问题的任何建议,以及我能做些什么来改善代码?

+3

的循环似乎没有比较对象的内容,只是重复地检查,如果地址'other'和'this'是相同。 – hmjd 2012-07-17 14:31:51

+0

嗯我甚至没有意识到,谢谢。大小比较至少正确吗?我对此有点不安。 – user1363061 2012-07-17 14:33:40

+0

可能不是。如果你有一个等于'char s [Size]的数组,那么它是不正确的,因为数组索引从0开始,这意味着最后一个有效索引是'Size - 1'。 – hmjd 2012-07-17 14:34:52

回答

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

是的,这正是我想要做的。唯一的问题是我不确定如何以最简单的方式做到这一点。 – user1363061 2012-07-17 14:37:20

+0

谢谢你!很有道理! – user1363061 2012-07-17 17:21:04

0

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

1

这不是太清楚是什么因素决定的平等,如果大小相等,但 环路建议您正在寻找的东西,如:

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

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

第二个问题是行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; 
} 
+0

非常感谢你!我猜测数据必须以某种方式分配。 – user1363061 2012-07-17 15:58:46