为什么这个断言失败了?

时间:2015-10-21 23:35:42

标签: c++ operator-overloading assert

assert中的main.cpp失败,我不明白为什么。 这是string.hpp

class String
{
private:
    int len;
    char* str;
public:
    String(char const* s);      // C-string constructor
    ~String() {delete str;};    // destructor
    char* const getString();    //get string for printing
};

inline bool operator==(String lhs, String rhs)
{
    return std::strcmp(lhs.getString(),rhs.getString());
}

// Define operator!= in terms of ==
inline bool operator!=(String const& lhs, String const& rhs)
{
    return !(lhs == rhs);
}

这里是string.cpp

String::String(char const* s)   // C-string constructor
{
    len = std::strlen(s);
    str = new char[len+1];
    std::strcpy(str,s);

}

char* const String::getString()
{
    return str;
}

这里是main.cpp

#include <cassert>
int main()
{
    String c = "c";
    String d = "d";

    assert(c == c);
    assert(c != d);
}

我试图只包含基本代码。我遗漏了很多明显的包括。 assert(c == d)失败了,我不明白为什么。 ==的运算符重载应该返回一个真实的结果。

2 个答案:

答案 0 :(得分:1)

如果字符串相等,则

std::strcmp返回0。因此,operator==会返回false以获得相等的字符串,true则返回。

例如,您可以切换==!=的实现,

答案 1 :(得分:0)

strcmp在其参数内容相同时返回0。

因此,在operator==

中添加0比较
inline bool operator==(String const& lhs, String const& rhs)
{
    return std::strcmp(lhs.getString(), rhs.getString()) == 0;
}

此外,由于您可能不希望每次调用operator==时都复制参数,我建议您通过引用传递它们。