Проблемы со строкой - PullRequest
0 голосов
/ 08 марта 2009

Я работаю с функцией cstring, которая должна сравнивать значения двух строк, MyString и m2. У меня есть #include, так что это определенно не так. это мои ошибки.

(74) : error C2275: 'MyString' : illegal use of this type as an expression
(74) : error C2660: 'MyString::length' : function does not take 1 arguments
(76) : error C2275: 'MyString' : illegal use of this type as an expression

и это код, из которого я их получаю.

bool MyString::operator ==(const MyString &m2) const
{
    int temp = 0;

    if (length(MyString) = length(m2)) // 74
    {
        if (strcmp(MyString, m2))  // 76
        {
            temp = 1;
        }
        else
        {
            temp = 2;
        }
    }
    if(temp = 2)
    {
        return "true";
    }
    else
    {
        return "false";
    }
}

Любая помощь по этому вопросу будет признателен, спасибо.

Ответы [ 2 ]

9 голосов
/ 08 марта 2009

Проблемы:

  • Вернуть true или false, а не «true» или «false»
  • Вы делаете сравнения с = вместо == (Вы используете = для сравнения дважды в своем коде)
  • Чтобы сослаться на себя в классе C ++, вам нужно использовать ключевое слово , это , а не имя класса.
  • Строка 74 должна быть:

    if (length() == m2.length()) // 74
    
  • strcmp принимает символ *, а не MyString.
  • Строка 76 должна быть:

    if (strcmp(this->c_str(), m2.c_str()))  // 76
    

В строке 76 предполагается, что тип MyString имеет функцию c_str (), которая возвращает указатель на буфер char [] с нулевым завершением.


Структура функции:

Структура функции действительно плохая. Рассмотрим что-то еще подобное:

bool MyString::operator ==(const MyString &m2) const
{
    if(this->length() != m2.length())
      return false;

    return !strcmp(this->c_str(), m2.c_str()));
}

Примечание: в вышеприведенных функциях это-> можно опустить.

2 голосов
/ 08 марта 2009

Большинство проблем уже решены. У меня просто есть предложение, которое не было написано выше:

Используйте форму свободной функции оператора сравнения вместо функции-члена:

bool operator == (MyString const &, MyString const &);

Вам нужно будет объявить его своим другом, если это зависит от личных данных / участников, но вы получите симметрию для вызывающих. Предполагая, что (как и в случае с std :: string) у вас есть неявное преобразование, определенное из const char * в вашу строку, реализация функции-члена == не является симметричной. Функции-члены требуют, чтобы левая часть была требуемого типа. Компилятор не будет выполнять преобразования в левой части сравнения:

// assumes MyString( const char* ) is defined and not explicit
// operator== defined as member function

const char* literal = "hola";
MyString str( "hola" );

if ( str == literal ) {} // correct
if ( literal == str ) {} // compilation error

Если вы реализуете в качестве функции-члена, в первом тесте компилятор создаст безымянную строку MyString и вызовет оператор преобразования. Во второй проверке компилятору не разрешается преобразовывать literal в MyString, поэтому он никогда не найдет вашу реализацию operator==.

Если вы предоставите сравнение как бесплатную функцию, то компилятор применит одинаковые правила преобразования с обеих сторон ==, а код скомпилируется и будет работать правильно.

В общем, то же самое относится и к остальным операторам (исключая operator [] и operator =, которые должны быть реализованы как функции-члены). Использование бесплатной версии функции обеспечивает симметрию.

...