Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Сравнение элементов в контейнерном классе array

#cpp #массивы #stl #сравнение


Проблема следующая, есть класс Person с именем и возрастом. Я создаю 2 контейнера
 array, забивая их какими-то экземплярами, и позже хочу сравнить эти контейнеры, на
что получаю ошибку. Оператор сравнения перегрузил, а на ютубе посмотрел, что мол перегрузки
будет достаточно для сравнения

Серьезность Код Описание    Проект  Файл    Строка  Состояние подавления
Ошибка  C2672   "operator __surrogate_func": не найдена соответствующая перегруженная
функция   prikl_programming   c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\xutility
   3084    

`#include 
 #include 
 #include 
 using namespace std;

 class Person {
 public:
 Person(int age, string name) {
    this->age = age;
    this->name = name;
 }
 Person() {
    age = 0;
    name = "null";
 }

 bool operator==(const Person& p) {
    if (this->age == p.age && this->name == p.name)
        return true;
    else
        return false;
 }

 private:
 int age;
 string name;

 friend ostream& operator<<(ostream& os, const Person& p);      
 };

 int main() {

 list l = { Person(1, ""), Person(2, ""), Person(3, "") };
 list l2 = { Person(2, ""), Person(2, ""), Person(3, "") };

 bool flag = (l == l2);
введите сюда код
 system("pause");
 return 0;
 }

 ostream & operator<<(ostream & os, const Person & p)
 {
 cout << p.age << " " << p.name;
 return os;
 }`

    


Ответы

Ответ 1



Попробуйте дать компилятору понять, что ваше сравнение не будет ничего менять в сравниваемых объектах - что это константная функция-член: bool operator==(const Person& p) const { if (this->age == p.age && this->name == p.name) return true; else return false; } (обратите внимание на второй const в первой строке).

Ответ 2



А давайте немного обсудим как лучше строить подобный код. Нужно иметь возможность знать имя или возраст личности, а также придать им новые значения поэтому проще эти поля сделать открытыми. И, так как тип не имеет других полей, то он легко сделается обычной структурой, не имеющей закрытых данных. Конструктор по умолчанию будет означать, что нам неизвестно имя и возраст личности. Он может быть определен посредством вызова имеющегося конструктора с конкретными аргументами. Сама личность не должна иметь функциональность сравнения себя с другой личностью. Такие функции лучше вынести за класс. Исходя из этих соображений напишем улучшенный код, где, кстати, не происходят лишные копировния строк и дальнейшее присваивание в конструкторе (как в вашем случаи): struct Person { int age{}; string name; Person(const int age, const string& name) : age(age), name(name) {} Person() : Person(0, "unknown") {} }; inline bool operator ==(const Person& p1, const Person& p2) { return p1.age == p2.age && p1.name == p2.name; } int main() { list l = { Person(1, ""), Person(2, ""), Person(3, "") }; list l2 = { Person(2, ""), Person(2, ""), Person(3, "") }; bool flag = (l == l2); //... } Такой код нагляднее показывает наши намерения и читабельней...

Комментариев нет:

Отправить комментарий