2015-10-21 14 views
0

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) терпит неудачу, и я не понимаю, почему. Перегрузка оператора == должна была вернуть истинный результат.

+1

Там нет 'утверждают (с == d)' ... – emlai

+1

Вы должны следовать [Правило трех] (HTTP: // stackoverflow.com/q/4172722/241631). Ваш 'operator ==' принимает значение 'String' по значению, что в противном случае приведет к двойному удалению. – Praetorian

+0

Не связано с проблемой: управление памятью ужасно неправильно. Также нет необходимости передавать аргументы операторов сравнения по значению, вместо этого используйте 'const &'. –

ответ

0

strcmp возвращает 0, если его аргументы имеют равное содержание.

Так добавить сравнение с 0 к operator==:

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

Кроме того, так как вы, вероятно, не хотите копировать аргументы каждый раз, когда вы называете operator==, я бы рекомендовал передать их по ссылке.

+0

Да, вот и все. Спасибо Зениту. – LeonhartDan

1

std::strcmp возвращает 0, если строки равны. Таким образом, ваш operator== вернет false для равных строк и true еще.

Вы могли бы, например, переключить Реализации == и != вокруг,

Смежные вопросы