Решил сначала написать сам, исходямиз знаний предыдущих уроков, и все получилось. Советую тем, кто поняли как работает перегрузка операторов сначала попробовать написать самим)
Я наконец-то вернулся продолжать обучение, а то с этой работой времени не было вообще весь июнь, теперь продолжаем напрягать извилины, которых уже не так много)) Спасибо за уроки, вы достаточно хорошо объясняете, удачи вам во всём. После прошлых уроков, этот каким-то лёгким показался)
Отличный урок! Не знаю, как вы, но я сначала ставлю на паузу и стараюсь сам написать нужный код, а потом смотрю, как это делает профи. Так вот - было смешно, когда я в итоге написал логику сравнения, за которую меня бы засмеяли! Но в этом и есть прелесть обучения
Не просто было, но после тщательного повтора все получилось как здесь. Нужно быть очень внимательными в этим делах (особенно для последних уроков #82 и #83). Это уже не совсем для новичков. Автор супер - почти на уровне Страструпа и к тому же на рус. с хорошей дикцией и красноречием. Здесь таких аналогов на рус. по плюсам пока нет.На этом фоне преподавание в уч. заведениях и в соц. на рус. по полюсам - полный отстой. Также респект автору за популяризацию современного оптимального стиля программирования.
еее остановил видео в начале и сделал эти две перегрузки для класа с масивом (data) довольно легко, дальше смысла смотреть этот видос нету, но лайк и комент для продвижения обязателен!)
вот дома сижу программирование учу, скоро курсы и чтобы не отставать заранее подучиваю (сеебался после 9, Батя сказал что в колледжах в ничему не научат и сказал учи дома и на курсы частные ходи) 2.5 года длительность на разработчика ПО
Круто пошел бы но я живу в Астане(страна Казахстан прямо под Россией) буду ходить на курсы в КомпАкадем ШАГ, почитал про 21-школу рилл круто то что принимают по навыкам и тестированию к тому же бесплатно, везет вам в Москве)
Как мне кажется, оператор "не равно" реализован неправильно. Он будет выдавать true только в том случае, когда сразу и иксы, и игреки не равны. Но чтобы точки были разными, достаточно, чтобы либо x, либо y не совпадали. поэтому && стоило бы заменить на || хотя это уже если придираться к смыслу. Спасибо за урок!
можно сделать немного короче bool operator == (const MyClass& other) { if (Size != other.Size) return false; for (int i = 0; i < Size; i++) { if (data[i] != other.data[i]) return false; } return true; }
А мне кажется, что в перегрузке оператора != лучше использовать ||, чем &&, ведь если одно поле первого будет равно полю второго, а другое поле не будет равно, то все равно выведется false. Но урок все равно отличный, как и все предыдущие и будущие. Спасибо большое!
Если кто-то пишет перегрузку операторов == и != для класса MyClass и испытывает трудности, то вот вам готовые решения, я уже эти трудности испытал. 1) Для оператора == в классе: bool operator ==(MyClass const& s) { cout
Не знаю как люди понимают этот урок, но не понимают предыдущий... Лично я понял эту тему исключительно благодаря пониманию предыдущей. Если бы не пример с присваиванием, я бы до сих пор путался в порядке, какой объект this, левый или правый, а какой other. А так, теперь понимаю, что this - a. Фактически "a == b" == " a.operator==(b);", отсюда и понимание, что есть что (что есть this, а что является other).
Кому интересна реализация оператора равенства для класса массива, вот как я его реализовал. Критику приветствую) bool operator == (ArrClass& other) { if (this->dataSize != other.dataSize) return false; for (int i = 0; i < dataSize; ++i) { if (data[i] == other.data[i]) continue; else return false; } return true; }
только хотя бы вот так: bool operator == (ArrClass& other) { if (this->dataSize != other.dataSize) return false; for (int i = 0; i < dataSize; ++i) { (data[i] == other.data[i]) ? continue : return false; } return true; } а то читать невозможно...
Великолепные уроки! Но есть вопрос. А почему не сделать так? bool operator ==(const Point &other) { return x == other.x && y == other.y; } bool operator !=(const Point &other) { return !operator==(other); }
@@КамаПуля-э7д А ты уверен? Мне кажется, что ты немного(много) так ошибаешься, всё работает, челик забыл скобки, когда писал {return !(operator ==(other));}, после такого изменения всё заработало
А не проще ли не дублировать код при отрицательной проверке (!=)? Можно как вариант написать функцию проверки так: bool operator !=(const Point & other) { return !(*this == other); }
Сергей, подскажите, пожалуйста, как лучше писать перегрузку оператора равенства? думаю между вашим вариантом и вот таким(через дружественную функцию делаю, так как операнды не изменяются): bool operator==(const Point &p1, const Point &p2) { return p1==p2; } и соответственно перегрузка оператора != будет bool operator!=(const Point &p1, const Point &p2) { return !(p1==p2); }
у меня возвращает true при любых значениях x, y, так и не нашел в чем косяк( хехе нашел ошибку случайно через несколько видео, конструктор принимающий значения x, y был пустой просто)
@@JTmartShturmannVideo нет косяка, есть такие законы логики - законы де Моргана. Один из них: !(a&&b)==!(a) || !(b) (только здесь == это тождественное равенство(например число Пи тождественно равно 3,14...., не логическое) У Сергея !(a&&b) , а у Вас !(a) || !(b) ;)
есть небольшое непонимание почему нельзя сделать вот так: bool Point::operator!= (const Point& right) { return this->x != right.x && this->y != right.y; } при этом, оператор работает как логическое "или". но: bool Point::operator!= (const Point& right) { return this->x != right.x || this->y != right.y; } работает как положено.
Кажется сам допер. Для решения без скобок и инвертирования всего выражения. Напишу, если кто задался вопросом: при сравнении одинаковых значений "Х" в левой части результат будет "0" и компилятор игнорирует правую часть, т.к. результат сравнения "0" с чем-либо даст "0", а поэтому необходимо проверять обе части выражения и использовать логическое "или" - "||".
Наверное потому что изначально "a" сравнивается с "b" a == b? / a.operator==(b); Как вызывался бы и метод класса через обьект Поэтому для объекта a вызывается перегруженный оператор и в this это будет "a", а в other - "b"
Спасибо за урок! Возник еще такой вопрос: если я хочу сравнить три переменные класса Point, то как мне это сделать? Мне не даст так просто при такой реализации написать например Point a(4, 2); Point b(4, 2); Point c(4, 3); bool result; result = a == b == c; Если с присваиванием прописали return *this, то тут так не получится, ведь здесь у нас перегрузка типа bool Мне кажется я чего-то недопонимаю...
Спасибо огромное за урок, все понятно) Но возник один вопрос: если у объекта по 100 полей, и я должен сравнивать по всем полям, то мне сравнение по каждому полю прописывать нужно?
почему никто не пишет что можно было просто вызвать обычное сравнения и потом инвертировать результат, в видео обычное нарушения D.R.Y. а вот метод более красив и понятен: bool operator!=(const Point &other) { return !(*this == other); }
@@sleepyNovember_project Ты разыменовываешь указатель и таким способом получаешь доступ к текущему объекту. Это то же самое, если бы была возможность писать this->object. Ты можешь получать доступ и к полям класса таким образом (*this).Size != other.Size вместо того, чтобы писать this->Size. Ну это так, для примера
@@illiahimself это всё понятно, но я не понял, зачем конкретно здесь разименование целого объекта, то есть значит именно сравнивается по соответствию всех значений полей в объекте или как?
@@sleepyNovember_project у тебя есть перегруженный оператор "==" и этим ретурном ты заходишь в этот оператор и возвращаешь обратный результат в перегруженный оператор "!=". В операции this == other у тебя сравниваются указатель и ссылка на объект и ты не можешь производить такое сравнение (типа указателя и типа объекта), поэтому чтобы получить доступ к объекту и произвести их сравнение тебе нужно разыменовать указатель. Ну и после этого ты заходишь в оператор "==" и там производится сравнение по тому, какую логику ты там заложил
кому мб нужен код для реализации для класса MyClass: в private создаем int count = 0; bool operator==(const MyClass& other) {
if (this->Size == other.Size) { for (int i = 0; i < other.Size; i++) { if (this->data[i] == other.data[i]) count++; } } return count > 0 ? true : false; } код покажется топорным, но он работает и я сам до него додумался ;)
Кто сможет решить эту задачу:21. Задача на взаимодействие между классами. Разработать систему «Интернет-магазин». Товаровед добавляет информацию о Товаре. Клиент делает и оплачивает Заказ на Товары. Товаровед регистрирует Продажу и может занести неплательщика в «черный список».
@@Nurdastg да,но какой мне в этом интерес?Там нужно делать примерно это,но чуть сложнее: MyClass arrMyClass[1]{}; int var = 1,i = 0; arrMyClass[i].setValueA(var);
Хочу предостеречь тех, кто попытается так сделать. Сравниваем Point(5, -2) и Point(-2, 5): x1 = 5, x2 = -2, y1 = -2, y2 = 5 !((5 - (-2)) + ((-2) - 5)) = !(7 + (-7)) = !(0) = true Соответственно, Point(5, -2) = Point(-2, 5), что, очевидно, неверно. Все дело в том, что целочисленные операции не эквивалентны булевым. Если же сильно хочется, то можно выполнить следующее преобразование (любопытствующим - гуглить "законы де Моргана"): NOT (A OR B) = (NOT A) AND (NOT B). Таким образом, получаем выражение !(x1 - x2) && !(y1 - y2). Здесь выражения !(...) примут значение true только тогда, когда в скобках будет 0, т.е. соответствующие координаты равны между собой. Значение же всего выражения станет true только тогда, когда оба выражения !(...) тоже будут true, т.е. тогда, когда x1 = x2 и y1 = y2
молодец, что как минимум понял, ведь ты расширил познания о программировании, и даже если это не понадобится тебе, то ты не зря потратил время. Н-р, на таких языках как C# такой проблемы нет, и ты будешь получить наслаждение от написания кода на нем, ведь ты знаешь, что как на самом деле это делать вручную. Понадобиться это может, если будешь делать какие-нибудь реальные проекты, грубо говоря, при обычном программировании я часто юзаю проверку на равенство переменных. Было бы странно, если бы данной нужды не было при использовании объектов).
Очень легко смотрится после 82 и 83 урока, спасибо вам большое, как всегда
Ну конкретно это видео крайне понятное, а вот на предыдущем я чето совсем завис..
@@rocker5652 Не ты один.
@@speedwagoooon8740 +
+
@@rocker5652 надо пересматривать несколько раз и никуда не спешить.
После 82 - 83 аж relax. Понятно и просто. Спасибо за урок
очень круто, спасибо что делаешь эти видосы, а то без них вообще бы загнулся
Решил сначала написать сам, исходямиз знаний предыдущих уроков, и все получилось. Советую тем, кто поняли как работает перегрузка операторов сначала попробовать написать самим)
тоже самое)
Благодарен за Ваш труд. С уважением Павел Иванович.
Благодарю за поддержку!
Перегрузка оператора равенства == и не равно !=. Перегрузка логических операторов сравнения. C++ Для начинающих. Урок#84
Ну это уже полегче чем перегрузка оператора присваивания))))
#перегрузкаоператоров #ООП #SimpleCode #урокипрограммирования
Я наконец-то вернулся продолжать обучение, а то с этой работой времени не было вообще весь июнь, теперь продолжаем напрягать извилины, которых уже не так много)) Спасибо за уроки, вы достаточно хорошо объясняете, удачи вам во всём. После прошлых уроков, этот каким-то лёгким показался)
Ну что, чего вы добились за 4 года?
Всё понятно и легко, хоть и не с первого раза доходит. Спасибо вам, Сергей, за ваши старания!!!
Отличный урок! Не знаю, как вы, но я сначала ставлю на паузу и стараюсь сам написать нужный код, а потом смотрю, как это делает профи. Так вот - было смешно, когда я в итоге написал логику сравнения, за которую меня бы засмеяли! Но в этом и есть прелесть обучения
Спасибо за урок.
Не просто было, но после тщательного повтора все получилось как здесь. Нужно быть очень внимательными в этим делах (особенно для последних уроков #82 и #83). Это уже не совсем для новичков. Автор супер - почти на уровне Страструпа и к тому же на рус. с хорошей дикцией и красноречием. Здесь таких аналогов на рус. по плюсам пока нет.На этом фоне преподавание в уч. заведениях и в соц. на рус. по полюсам - полный отстой. Также респект автору за популяризацию современного оптимального стиля программирования.
Это тема для новичков, даже я, новичок это понимаю
Тема новичковая, начало ООП самое. Сложно будет дальше
Спасибо за урок, как всегда) очень хочется по с# такие же уроки
Пожалуйста! C# обязательно будет, но позже =)
еее остановил видео в начале и сделал эти две перегрузки для класа с масивом (data) довольно легко, дальше смысла смотреть этот видос нету, но лайк и комент для продвижения обязателен!)
найс понятненько и просто
можно в main инвертировать вот так :
bool res = !(a == b);
На многих роликах 0 дизлайков
0 ничего не понявших школьников. Не может не радовать:)
школьники до ооп не доходят
вот дома сижу программирование учу, скоро курсы и чтобы не отставать заранее подучиваю (сеебался после 9, Батя сказал что в колледжах в ничему не научат и сказал учи дома и на курсы частные ходи) 2.5 года длительность на разработчика ПО
появились ещё такие штуки как школа 21 в Москве ну и у нас UNIT Factory есть, лол.
Круто пошел бы но я живу в Астане(страна Казахстан прямо под Россией) буду ходить на курсы в КомпАкадем ШАГ, почитал про 21-школу рилл круто то что принимают по навыкам и тестированию к тому же бесплатно, везет вам в Москве)
@@naikvitlich1093 я в Киеве, но ваших у нас есть норм так, прикольные ребята, я в этом году поступил
Большое спасибо вам за урок и прекрасное пояснение, Сергей!
Спасибо, после предыдущих двух роликов это кажется легким!
Сергей, спасибо за уроки, благодаря предыдущим получилось написать оператор равенства самому)
Перегрузил для класса мойкласс все получилось, спасибо за урок
очень доступно и понятно! Просто супер
как всегда лучший!
Комментарий для продвижения. Спасибо
Спасибо за урок! Спасибо за знания! Лайк, однозначно!
Как мне кажется, оператор "не равно" реализован неправильно. Он будет выдавать true только в том случае, когда сразу и иксы, и игреки не равны. Но чтобы точки были разными, достаточно, чтобы либо x, либо y не совпадали. поэтому && стоило бы заменить на ||
хотя это уже если придираться к смыслу. Спасибо за урок!
Вообще можно было просто инвертировать результат вычисления оператора проверки на равенство (он ведь уже готов)
return !(*this == other);
Для массивов
bool operator== (const myclass& other)
{
if (!(this->Size == other.Size))
{
return false;
}
for (int i = 0; i < this->Size; i++)
{
if (this->arr[i] == other.arr[i])
{
continue;
}
else
{
return false;
}
}
return true;
}
можно сделать немного короче
bool operator == (const MyClass& other) {
if (Size != other.Size) return false;
for (int i = 0; i < Size; i++) {
if (data[i] != other.data[i]) return false;
}
return true;
}
Спасибо. Объяснение очень понятное.
наконец-то урок который я полностью понял)
Спасибо за видео!
В прошлых уроках разбирали перегрузку для динамически выделенных массивов, так что целесообразнее было показать перегрузку на примере этих же массивов.
Кому нужно, вот часть кода для массивов:
// перегрузка оператора ==
bool operator == (const MyClass& other) {
if (this->size != other.size) { return false; }
else {
for (int i = 0; i < other.size; i++) {
if (this->data[i] != other.data[i]) {
return false;
}
}
}
return true;
}
// перегрузка оператора !=
bool operator != (const MyClass& other) {
if (this->size != other.size) { return true; }
else {
for (int i = 0; i < other.size; i++) {
if (this->data[i] != other.data[i]) {
return true;
}
}
}
return false;
}
Спасибо за знания !
А мне кажется, что в перегрузке оператора != лучше использовать ||, чем &&, ведь если одно поле первого будет равно полю второго, а другое поле не будет равно, то все равно выведется false. Но урок все равно отличный, как и все предыдущие и будущие. Спасибо большое!
Не только тебе так кажется. think about it /(o_o)
@@nexusgaming1912 почему нельзя юзать ИЛИ ? Должно же работать....
Очередное огромное спасибо
Спасибо, очень сильно помог
Ну это естественно лайк!)
Спасибо
Сергей вы лучший)
Спасибо огромное!
привет из 2023, спасибо большое за уроки!
Если кто-то пишет перегрузку операторов == и != для класса MyClass и испытывает трудности, то вот вам готовые решения, я уже эти трудности испытал.
1) Для оператора ==
в классе:
bool operator ==(MyClass const& s) {
cout
Если вспомнить как мы присваивали значения елементам масива то окажется что кроме проверки на размер больше ничево не нужно
Введи два разных массива, но первый элемент сделай одинаковый, получишь удивительный результат.
@@validdoll так вдруг элементы в массиве будут разные?
@@hub945 Он там просто про цикл for забыл, он был в ==, но почему-то он забыл его написать в !=. Бывает
Все четко!
Спасибо!
Не знаю как люди понимают этот урок, но не понимают предыдущий... Лично я понял эту тему исключительно благодаря пониманию предыдущей. Если бы не пример с присваиванием, я бы до сих пор путался в порядке, какой объект this, левый или правый, а какой other. А так, теперь понимаю, что this - a. Фактически "a == b" == " a.operator==(b);", отсюда и понимание, что есть что (что есть this, а что является other).
Спасибо!🥰
А это работает при структурах(struct)???
да
@@СергейПетров-б1ф спасибо
А вы можете организовать донаты, мне кажется многие бы поддержали ваш канал) я+
5.35 - или очень тонкий тролль, или.. одно из двух..)))
Кому интересна реализация оператора равенства для класса массива, вот как я его реализовал. Критику приветствую)
bool operator == (ArrClass& other) {
if (this->dataSize != other.dataSize) return false;
for (int i = 0; i < dataSize; ++i) {
if (data[i] == other.data[i]) continue;
else return false;
}
return true;
}
только хотя бы вот так:
bool operator == (ArrClass& other)
{
if (this->dataSize != other.dataSize) return false;
for (int i = 0; i < dataSize; ++i)
{
(data[i] == other.data[i]) ? continue : return false;
}
return true;
}
а то читать невозможно...
Великолепные уроки! Но есть вопрос.
А почему не сделать так?
bool operator ==(const Point &other) { return x == other.x && y == other.y; }
bool operator !=(const Point &other) { return !operator==(other); }
Так не получится потому что
@@md.403 можете объяснить последний ваш абзац. Не очень понял ,что такое not_equal_1
@@КамаПуля-э7д А ты уверен? Мне кажется, что ты немного(много) так ошибаешься, всё работает, челик забыл скобки, когда писал {return !(operator ==(other));}, после такого изменения всё заработало
@@andreyvolkov3117 2 года прошло с того момента как я оставил комментарий, думаешь, я помню, о чем он был?
@@КамаПуля-э7д ну, будут люди, так они хоть прочитают и поймут, что работает
Шикарно
питонячий вывод массива в консоль
operator string()
{
string arr = "[";
for (int i = 0; i < Size; i++)
arr += to_string(data[i]) + ", ";
if (Size == 0)
arr += "]";
else
arr += "\b\b]";
return arr;
}
Небольшой косяк на превью. Изображён оператор присваивания.
Я думаю что в операторе != нужно && поменять на ||.Разве не так?Просто если x =other.x , а y!=other.y то он скажет , что они равны хотя это не так
а ты гений оказывается
Именно так, в видосе ошибка!
А не проще ли не дублировать код при отрицательной проверке (!=)?
Можно как вариант написать функцию проверки так:
bool operator !=(const Point & other)
{
return !(*this == other);
}
Мне кажется это менее оптимизировано
@@milsnel когда кажется, надо обосновывать. В моем условии всего лишь одна проверка, что может быть оптимизированней
спасибо
Почему указатель на массив в классе MyClass вы инициализируете в области public?
Сергей, подскажите, пожалуйста, как лучше писать перегрузку оператора равенства? думаю между вашим вариантом и вот таким(через дружественную функцию делаю, так как операнды не изменяются):
bool operator==(const Point &p1, const Point &p2)
{
return p1==p2;
}
и соответственно перегрузка оператора != будет
bool operator!=(const Point &p1, const Point &p2)
{
return !(p1==p2);
}
подскажите пожалуйста у меня в первом случае выдает все время true , а во втором false с чем это может быть связано?
ребят, обязательно ли смотреть стрим или можно пропустить?
у меня возвращает true при любых значениях x, y, так и не нашел в чем косяк( хехе нашел ошибку случайно через несколько видео, конструктор принимающий значения x, y был пустой просто)
в коде не равенства косяк в && и || ну и я бы написал так:
bool operator !=(const Point & other)
{
return this->x != other.x || this->y != other.y;
}
А можешь сказать,как исправить, пожалуйста ?
@@JTmartShturmannVideo нет косяка, есть такие законы логики - законы де Моргана. Один из них:
!(a&&b)==!(a) || !(b) (только здесь == это тождественное равенство(например число Пи тождественно равно 3,14...., не логическое)
У Сергея !(a&&b) , а у Вас !(a) || !(b) ;)
@@coldproducer Он даже написал где ошибка, если тебе этого мало, то может программирование не твоё? Или может ты много уроков пропустил?
А ты мог через SetX и SetY сделать, чтобы не заполнять конструктор
Чтобы Я без Вас делал ? . Спасибо
есть ли разница как получать значения this->x или this->GetX и если есть то какая? Или без разницы, можно и так и так?
через cout
не нужно перегружать, нужно скобки поставить std::cout
есть небольшое непонимание почему нельзя сделать вот так:
bool Point::operator!= (const Point& right)
{
return this->x != right.x && this->y != right.y;
}
при этом, оператор работает как логическое "или". но:
bool Point::operator!= (const Point& right)
{
return this->x != right.x || this->y != right.y;
}
работает как положено.
Кажется сам допер. Для решения без скобок и инвертирования всего выражения. Напишу, если кто задался вопросом: при сравнении одинаковых значений "Х" в левой части результат будет "0" и компилятор игнорирует правую часть, т.к. результат сравнения "0" с чем-либо даст "0", а поэтому необходимо проверять обе части выражения и использовать логическое "или" - "||".
-ONE LESSON, +ONE PROFIT!
Почему в this попала переменная а, в others попала переменная b?
Наверное потому что изначально "a" сравнивается с "b"
a == b? / a.operator==(b);
Как вызывался бы и метод класса через обьект
Поэтому для объекта a вызывается перегруженный оператор и в this это будет "a", а в other - "b"
Спасибо за урок!
Возник еще такой вопрос: если я хочу сравнить три переменные класса Point, то как мне это сделать? Мне не даст так просто при такой реализации написать например
Point a(4, 2);
Point b(4, 2);
Point c(4, 3);
bool result;
result = a == b == c;
Если с присваиванием прописали return *this, то тут так не получится, ведь здесь у нас перегрузка типа bool
Мне кажется я чего-то недопонимаю...
@@Petr-kh1lt Да, хорошее решение, спасибо)
@@Petr-kh1lt Можно (a==b)==c
@@sergeyandreev8709 видимо чел не даёт бесплатных уроков направо и налево, удалил коммент xd
по моему для перегрузок и конструкторов и диструкторов нужно делать шаблонные куски кода , чтобы быстро их подставлять?
А как сравнивать сразу 3 объекта (a==b==c)?
(a==b)==c или a==b && a==c
Спасибо огромное за урок, все понятно) Но возник один вопрос: если у объекта по 100 полей, и я должен сравнивать по всем полям, то мне сравнение по каждому полю прописывать нужно?
Используй циклы !
в питоне это магические методы)
а почему мы не можем воспользоваться геттерами, а берем значения напрямую?
Перегрузка операторов < и >
#include
#include
using namespace std;
class Point {
public:
Point(int x, int y) {
this->x = x;
this->y = y;
}
string operator < (const Point& other) {
int thisVectrorLength = pow(this->x, 2) + pow(this->y, 2);
int otherVectrorLength = pow(other.x, 2) + pow(other.y, 2);
if (thisVectrorLength < otherVectrorLength) {
return "true";
}
else return "false";
}
string operator > (const Point& other) {
int thisVectrorLength = pow(this->x, 2) + pow(this->y, 2);
int otherVectrorLength = pow(other.x, 2) + pow(other.y, 2);
if (thisVectrorLength < otherVectrorLength) {
return "false";
}
else return "true";
}
private:
int x;
int y;
};
int main() {
Point a(1, 4);
Point b(0, 2);
string res = b < a;
string res2 = b > a;
cout
сравниваються по длинне вектора
А как сделать так с матрицей?
А можно в операторе "не равно" написать "return !(this==other)"?
Проверил, может кому пригодится)
Вот так вроде работает " return !(this->operator==(other)); "
@@iVAtcg а еще можно И заменить на ИЛИ.
Спсб
Для тех семерых ребят, что поставили дизлайки, заготовленно отдельное местечко в аду...
up
почему никто не пишет что можно было просто вызвать обычное сравнения и потом инвертировать результат, в видео обычное нарушения D.R.Y. а вот метод более красив и понятен:
bool operator!=(const Point &other) { return !(*this == other); }
нарушение сухова, лол
а зачем здесь указатель?
@@sleepyNovember_project Ты разыменовываешь указатель и таким способом получаешь доступ к текущему объекту. Это то же самое, если бы была возможность писать this->object. Ты можешь получать доступ и к полям класса таким образом (*this).Size != other.Size вместо того, чтобы писать this->Size. Ну это так, для примера
@@illiahimself это всё понятно, но я не понял, зачем конкретно здесь разименование целого объекта, то есть значит именно сравнивается по соответствию всех значений полей в объекте или как?
@@sleepyNovember_project у тебя есть перегруженный оператор "==" и этим ретурном ты заходишь в этот оператор и возвращаешь обратный результат в перегруженный оператор "!=". В операции this == other у тебя сравниваются указатель и ссылка на объект и ты не можешь производить такое сравнение (типа указателя и типа объекта), поэтому чтобы получить доступ к объекту и произвести их сравнение тебе нужно разыменовать указатель. Ну и после этого ты заходишь в оператор "==" и там производится сравнение по тому, какую логику ты там заложил
10/10
А почему это называется перегрузкой? Аналогии с перегрузкой конструктора или функций не вижу.
Случайно наткнулся на Вики на статью про перегрузку, в ней говорится, что это "калька" с англ. overload.
Т.е просто так перевели и используют.
bool operator == (const Point& another) {
return (this->x == another.x) && (this->y == another.y);
}
bool operator != (const Point& another) {
return !(*this == another);
}
bool operator!=(const Point& other){
return !(*this == other);
}
с динамической памятью такое не прокатит
кому мб нужен код для реализации для класса MyClass:
в private создаем int count = 0;
bool operator==(const MyClass& other)
{
if (this->Size == other.Size)
{
for (int i = 0; i < other.Size; i++)
{
if (this->data[i] == other.data[i])
count++;
}
}
return count > 0 ? true : false;
}
код покажется топорным, но он работает и я сам до него додумался ;)
Кто сможет решить эту задачу:21. Задача на взаимодействие между классами. Разработать систему «Интернет-магазин».
Товаровед добавляет информацию о Товаре. Клиент делает и оплачивает Заказ на Товары.
Товаровед регистрирует Продажу и может занести неплательщика в «черный список».
Если можно создать массив объектов,то проблем вообще никаких нет.
Сможете решить эту задачу?
@@Nurdastg да,но какой мне в этом интерес?Там нужно делать примерно это,но чуть сложнее:
MyClass arrMyClass[1]{};
int var = 1,i = 0;
arrMyClass[i].setValueA(var);
@@ИгорьДементьев-и7м если вам заплачу,не можете?
@@Nurdastg могу бесплатно,но без динамических массивов.Больно уж в лом мне с ними возиться.
return !((x1-x2) + (y1 - y2));
Хочу предостеречь тех, кто попытается так сделать. Сравниваем Point(5, -2) и Point(-2, 5):
x1 = 5, x2 = -2, y1 = -2, y2 = 5
!((5 - (-2)) + ((-2) - 5)) = !(7 + (-7)) = !(0) = true
Соответственно, Point(5, -2) = Point(-2, 5), что, очевидно, неверно. Все дело в том, что целочисленные операции не эквивалентны булевым.
Если же сильно хочется, то можно выполнить следующее преобразование (любопытствующим - гуглить "законы де Моргана"): NOT (A OR B) = (NOT A) AND (NOT B). Таким образом, получаем выражение !(x1 - x2) && !(y1 - y2). Здесь выражения !(...) примут значение true только тогда, когда в скобках будет 0, т.е. соответствующие координаты равны между собой. Значение же всего выражения станет true только тогда, когда оба выражения !(...) тоже будут true, т.е. тогда, когда x1 = x2 и y1 = y2
Я конечно понял как это работает, но применение не совсем осознал
молодец, что как минимум понял, ведь ты расширил познания о программировании, и даже если это не понадобится тебе, то ты не зря потратил время. Н-р, на таких языках как C# такой проблемы нет, и ты будешь получить наслаждение от написания кода на нем, ведь ты знаешь, что как на самом деле это делать вручную. Понадобиться это может, если будешь делать какие-нибудь реальные проекты, грубо говоря, при обычном программировании я часто юзаю проверку на равенство переменных. Было бы странно, если бы данной нужды не было при использовании объектов).
+
поскольку я здесь хотелось бы передать
#include
using namespeace std;
int main()
{
cout
Страшна вырубай
отсутствует оператор "==", соответствующий этим операндам
отсутствует оператор "==", соответствующий этим операндам
типы операндов: MyClass == MyClass
прошло 3 года, теперь смотрим новички :)
#include
using namespace std;
double max(double a,double b) {
if (a >= b) {
return a;
}
else { return b; }
}
class test
{
public:
test(int size){
this->Size = size;
this->data = new int[size];
for (int i = 0; i < size; i++)
{
data[i] = i;
}
cout data[i]) {
continue;
}
else {
return false;
}
}
return true;
}
~test() {
cout
Спасибо
Спасибо!
спасибо
Спасибо!