2012-04-28 2 views
0

Мне нужно сделать некоторое логическое сравнение и вернуть логический ответ.Логическое сравнение == Перегрузка оператора

Вот код из файла .cpp:

bool MyString::operator==(const MyString& other)const 
{ 
    if(other.Size == this.Size) 
    { 
      for(int i = 0; i < this.Size+1; i++) 
      { 
        if(this[i] == other[i]) 

          return true; 
      } 
    } 
    else 
      return false; 
} 

Вот что называется из main.cpp файла:

if (String1 == String4) 
{ 
    String3.Print(); 
} 
else 
{ 
    String4.Print(); 
} 

Здесь есть ошибки компиляции я получаю:

error: request for member `Size` in `this`, which is of non-class type `const MyString* const` 
error: no match for `operator[]` in `other[i]` 
+2

'если (это [я] == Другие [я]) возвращающие;' Это собирается вызвать проблемы позже. Подумайте о том, что вы там делаете. – chris

+0

Это на самом деле единственная ошибка, которую я получаю сейчас. Все, что я хочу сделать, это сравнить содержимое обеих строк. Как я мог это сделать, не перегружая также операторы []? – user1363061

ответ

2

Проблемы с кодом:

  • this[i]: Вы, видимо, хотите получить доступ к г-й символ строки здесь. Это не так. Предполагая, что ваш класс перегружает operator[], вы хотите (*this)[i]. Кроме того, вы можете напрямую получить доступ к внутреннему представлению строки.

  • if(this[i] == other[i]) return true;: Подумайте, что это значит относительно сравнения строк «A1» и «AB».

  • for() {...}: Что происходит, когда вы выходите из цикла? Вам нужно что-то вернуть, если сравнения удастся выполнить через цикл, не возвращаясь.

+0

класс действительно не перегружает оператор [], в этом случае что мне делать? Для этого цикла я просто хочу проверить, одинаковы ли две строки по длине и то же самое в контенте. Если это так, верните true. – user1363061

+0

Доступ к внутреннему представлению вашей строки. У вас определенно есть элемент данных, который хранит содержимое строки. Получите доступ к нему. –

+0

Вот что меня смущает и вам нужна помощь. – user1363061

4

this - указатель, поэтому вы должны его разыменовать:

this->Size; 

Кроме того, я думаю, что логика вашего operator== несовершенен - ​​вот, он возвращает true, если какой-либо из символов равно символа на той же позиции во второй строке. Изменение цикла для

 for(int i = 0; i < this->Size+1; i++) 
     { 
       if(this[i] != other[i]) 

         return false; 
     } 

и поставить return true; вместо последней части вашего кода (else п) для сравнения целых строк.

Как уже упоминалось Сет, вы не можете использовать operator[] на this как описано выше, - таким образом, он рассматривается как массив (т.е. this[i] действительно *(this + i) - так не то, что вы думаете, что это). Вместо этого выберите свой внутренний элемент хранения.

+0

Вы сказали ему не использовать 'this.Size', тогда вы использовали его в своем примере? Кроме того, '(* this) [i]' является вполне разумным вариантом (в случае, если 'operator []' делает что-то более сложное, чем индексирование массива).Я не думаю, что условие завершения цикла является правильным. –

+1

Или даже лучше, используйте 'std :: equal'. – juanchopanza

+0

@Griwes: Я знаю, но ваш фрагмент кода этого не делает. –

0

Вы не указали, можете ли вы использовать стандартные алгоритмы C++ или нет. Здесь иллюстрировали обе версии, используя рукописную петлю и std::equal алгоритм:

//#define USE_STD_ALGORITHM 1 // uncomment to enable std::equal version 
#include <cassert> 
#include <algorithm> 
#include <stdexcept> 

// NOTE: partial simplest definition for the test and presentation purposes only. 
struct MyString 
{ 
    MyString(char const* s, std::size_t size) : data(s), Size(size) {} 
    char const& operator[](std::size_t index) const; 
    bool operator==(const MyString& other) const; 
private: 
    char const* data; 
    std::size_t Size; 
}; 

char const& MyString::operator[](std::size_t index) const 
{ 
    if (index < Size) 
     return data[index]; 
    throw std::out_of_range("index invalid"); 
} 

bool MyString::operator==(const MyString& other) const 
{ 
    if (this->Size == other.Size) 
    { 
#ifdef USE_STD_ALGORITHM 
     return std::equal(data, data+Size, other.data); 
#else 
    bool equal = true; 
    for(std::size_t i = 0; i < this->Size; ++i) 
    { 
     if((*this)[i] != other[i]) 
     { 
      equal = false; 
      break; 
     } 
    } 
    return equal; 
#endif 
    } 

    return false; 
} 

int main() 
{ 
    char const* a = "abc"; 
    char const* b = "abc"; 
    MyString sa(a, 3); 
    MyString sb(b, 3); 
    assert(sa == sb); 

    char const* c = "adc"; 
    MyString sc(c, 3); 
    assert(!(sa == sc)); 

    char const* d = "ab"; 
    MyString sd(d, 2); 
    assert(!(sa == sd)); 
} 

Удачи!

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