这是我的逻辑比较运算符(==)重载的代码。我用它来检查两个字符串的大小和内容是否相同。否则它应该返回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函数的结束。有关如何解决此问题的建议以及我可以采取哪些措施来改进代码?
答案 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
的“默认”行为。这是你想要的功能,编译器或语法检查器不会抱怨。