Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
 Аватар для delete1991
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82

Перегрузка операторов

08.05.2011, 02:03. Показов 3889. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот есть такое задание
Для заданного по варианту класса выполнить следующие действия:
1) описать все типы конструкторов и деструктор (по необходимости);
2) переопределить оператор вывода в поток <<;
3) переопределить оператор ввода из потока >>;
4) переопределить заданные по варианту операторы;
5) предусмотреть обработку ошибок.
Создать два объекта заданного по варианту класса и на их примере продемонстрировать корректную работу всех перегруженных операторов.

Вариант №7
Создать класс треугольник Triangle (хранит стороны a, b, c). Перегрузить операторы:
1) + как унарный метод класса, вычисляющий периметр треугольника;
2) ! как унарную дружественную функцию, проверяющую возможность существования заданного треугольника (ни одна из сторон не может быть равной сумме двух других сторон или превышать ее);
3) <= как бинарный метод класса, сравнивающий длины периметров двух треугольников;
4) == как бинарную дружественную функцию, проверяющую равенство сторон треугольников.

я эт задание реализовал вот спомощью такого кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//---------------------------------------------------------------------------
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
#pragma argsused
class Triangle {
private:
        int a,b,c;
public:
        Triangle(int a1, int b1, int c1);
        int operator +();   //периметр треугольника
        bool operator <=(Triangle&);
        bool operator==(Triangle&);
        friend bool operator !(Triangle &t);
        friend istream& operator>>(istream&,Triangle&);
        friend ostream& operator<<(ostream&,Triangle&);
 
};
Triangle::Triangle(int a1=1, int b1=1, int c1=1): a(a1), b(b1), c(c1) {};   //конструктор
int input_errors(); //функция проверку на ошибку ввода переменной
 
int input_errors() {
int x;
while(1) {
        cin>>x;
        if (cin.fail()) {
                cout<<"ERROR!!!"<<endl;
                cout<<"Enter the number of integer: ";
                cin.clear();
                cin.ignore();
        } else break;
};
return x;
};
 
 
//-------------описание класса--------------
 
int Triangle::operator +() {
return a+b+c;
};
 
bool Triangle::operator <=(Triangle& tr) {
return +(*this)<=+tr;
};
 
bool Triangle::operator ==(Triangle &tr)
{
bool f=false;
if ((a==tr.a) && (b==tr.b) && (c==tr.c))
        f=true;
return f;
}
 
istream& operator>>(istream& in, Triangle &tr) {
cout<<"a=";
tr.a=input_errors();
cout<<"b=";
tr.b=input_errors();
cout<<"c=";
tr.c=input_errors();
return in;
};
 
ostream& operator<<(ostream& out, Triangle &tr) {
out<<"a="<<tr.a<<endl;
out<<"b="<<tr.b<<endl;
out<<"c="<<tr.c<<endl;
return out;
};
//------------описание дружественной функции----------------------
bool operator !(Triangle &t) {
bool f=false;
f=t.a<t.b+t.c;
f&=t.b<t.a+t.c;
f&=t.c<t.a+t.b;
if ((t.a<t.b+t.c) && (t.b<t.a+t.c) && (t.c<t.a+t.b))
        f=true;
return f;
};
 
int main(int argc, char* argv[])
{
Triangle t1,t2;
cout<<"Enter the side of the triangle 1"<<endl;
cin>>t1;
cout<<"Enter the side of the triangle 2"<<endl;
cin>>t2;
cout<<endl<<"The perimeter of the triangle 1="<<+t1<<endl;
cout<<"The perimeter of the triangle 2="<<+t2<<endl;
if (!t1)
        cout<<"There is a triangle 1";
else
        cout<<"Triangle 1 does not exist";
cout<<endl;
if (!t2)
        cout<<"There is a triangle 2";
else
        cout<<"Triangle 2 does not exist";
cout<<endl;
if (t1<=t2)
        cout<<"t1<=t2";
else
        cout<<"t1>=t2";
cout<<endl;
if (t1==t2)
        cout<<"Storony ravny";
else
        cout<<"Storony ne ravny";
getch();
        return 0;
}
//---------------------------------------------------------------------------
мне нужно дописать к ней два задания:
1) унарного способа перегрузки операторов. Если а=0, то тогда вывести сообщения (а относится к 1 объекту (t1))
2) бинарный способ перегрузки. Найти сумму а1+а2, т.е а первого треугольника(t1), и а второго треугольника(t2)

я не очень разобрался с перегрузками, плиз спасите неуча
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.05.2011, 02:03
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

перегрузка операторов
Это часть хедера(весь большеват) #include &lt;iostream&gt; #include &lt;cstdio&gt; using namespace std; class mString{ char *str; ...

Перегрузка операторов
Здравствуйте! Сделал класс квадратной матрицы. Содержит конструктор по умолчанию, конструктор с параметрами, конструктор копирования,...

6
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
08.05.2011, 10:19
1. Поля треугольника - вещественные.
2.
1) + как унарный метод класса, вычисляющий периметр треугольника;
2) ! как унарную дружественную функцию, проверяющую возможность существования заданного треугольника (ни одна из сторон не может быть равной сумме двух других сторон или превышать ее);
3) <= как бинарный метод класса, сравнивающий длины периметров двух треугольников;
4) == как бинарную дружественную функцию, проверяющую равенство сторон треугольников.
C++
1
2
3
4
5
6
int operator +();   //периметр треугольника
        bool operator <=(Triangle&);
        bool operator==(Triangle&);
        friend bool operator !(Triangle &t);
        friend istream& operator>>(istream&,Triangle&);
        friend ostream& operator<<(ostream&,Triangle&);
operator+ объявлено правильно. Только возвращаемое значение - вещественное, так как поля должны быть вещественными.
operator<= объявлено правильно. Но из объявления параметра надо убрать ссылку. Или передавать по константной ссылке - правый аргумент не изменяется.
operator== объявлено НЕправильно! Это должна быть дружественная функция с двумя параметрами
operator! объявлено правильно. Но из объявления параметра надо убрать ссылку. Или передавать по константной ссылке - правый аргумент не изменяется.
В функции вывода из объявления параметра надо убрать ссылку. Или передавать по константной ссылке - правый аргумент не изменяется.
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.05.2011, 11:32
Цитата Сообщение от delete1991 Посмотреть сообщение
1) унарного способа перегрузки операторов. Если а=0, то тогда вывести сообщения (а относится к 1 объекту (t1))
Какой оператор-то перегружать?

Цитата Сообщение от delete1991 Посмотреть сообщение
2) бинарный способ перегрузки. Найти сумму а1+а2, т.е а первого треугольника(t1), и а второго треугольника(t2)
Что получается при суммировании треугольника и как суммировать треугольники?

В догонку. Стороны треугольника, как сказал предыдущий оратор, действительно лучше сделать вещественными числами. Обратите внимание, что два вещественных числа из-за особенности архитектуры никогда не будут равны. Надо сверять абсолютное значение их разности с неким эпсилоном -- точностью.

Например.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <cmath>
#include <iostream>
 
class Triangle {
 public:
  Triangle() : a_(0), b_(0), c_(0) {}
  Triangle(float a, float b, float c)
    : a_(a), b_(b), c_(c) {}
  bool operator==(const Triangle &other) {
    return (fabs(a_ - other.a()) < epsilon &&
            fabs(b_ - other.b()) < epsilon &&
            fabs(c_ - other.c()) < epsilon);
  }
  bool operator!() {
    return (a_ < (b_ + c_) && b_ < (c_ + a_) && c_ < (b_ + a_));
  }
  float operator+() const {
    return (a_ + b_ + c_);
  }
  bool operator<=(const Triangle &other) {
    return fabs((a_ + b_ + c_) - (other.a() + other.b() + other.c())) < epsilon;
  }
  bool operator~() const {
    return a_ < epsilon;
  }
  float operator+(const Triangle &other) {
    return +*this + +other;
  }
  friend std::ostream &operator<<(std::ostream &stream, const Triangle &t) {
    return stream << "(" << t.a() << ", " << t.b() << ", " << t.c() << ")";
  }
  friend std::istream &operator>>(std::istream &stream, Triangle &t) {
    return stream >> t.a_ >> t.b_ >> t.c_;
  }
  float a() const { return a_; }
  float b() const { return b_; }
  float c() const { return c_; }
 private:
  float a_;
  float b_;
  float c_;
  const static float epsilon = 0.0001;
};
 
int main(int argc, char *argv[]) {
  Triangle a(2, 2, 2), b(2, 2, 2);
  std::cout << a << " " << b << std::endl
            << a + b << std::endl
            << (a == b) << std::endl 
            << !a << std::endl
            << ~a << std::endl
            << (a <= b) << std::endl
            << +a << " " << +b << std::endl;
  return 0;
}
0
 Аватар для delete1991
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82
08.05.2011, 14:46  [ТС]
Цитата Сообщение от lemegeton Посмотреть сообщение
Сообщение от delete1991
1) унарного способа перегрузки операторов. Если а=0, то тогда вывести сообщения (а относится к 1 объекту (t1))
Какой оператор-то перегружать?
Сообщение от delete1991
ну если можно сделать перегрузку оператора != чтобы он выполнял операцию в задание

Добавлено через 2 минуты
Цитата Сообщение от lemegeton Посмотреть сообщение
Сообщение от delete1991
2) бинарный способ перегрузки. Найти сумму а1+а2, т.е а первого треугольника(t1), и а второго треугольника(t2)
Что получается при суммировании треугольника и как суммировать треугольники?
я создаю же два объекта t1 и t2. в первый объект я ввожу размеры сторон a,b,c, и во второй объект я ввожу размеры сторон a,b,c. Вот мне нужно сложить сторону а первого объекта со сторой а второго объекта. МОжно ли это реализовать с помощью оператора ++
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
08.05.2011, 18:57
Цитата Сообщение от delete1991 Посмотреть сообщение
ну если можно сделать перегрузку оператора != чтобы он выполнял операцию в задание
Нельзя. Он бинарный.

Ну вот класс, который реализует все означенное.
operator~ -- в качестве унарного a == 0. Только не "выводит сообщение", а возвращает true.
С геттерами и сеттерами, как в книжке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <cmath>
#include <iostream>
 
class Triangle {
 public:
  Triangle() : a_(0), b_(0), c_(0) {}
  Triangle(float a, float b, float c)
    : a_(a), b_(b), c_(c) {}
  bool operator==(const Triangle &other) const {
    return (fabs(a_ - other.a()) < epsilon &&
            fabs(b_ - other.b()) < epsilon &&
            fabs(c_ - other.c()) < epsilon);
  }
  bool operator!() const {
    return (a_ < (b_ + c_) && b_ < (c_ + a_) && c_ < (b_ + a_));
  }
  float operator+() const {
    return (a_ + b_ + c_);
  }
  bool operator<=(const Triangle &other) const {
    return fabs((a_ + b_ + c_) - (other.a() + other.b() + other.c())) < epsilon;
  }
  bool operator~() const {
    return fabs(a_) < epsilon;
  }
  Triangle operator+(const Triangle &other) const {
    return Triangle(a() + other.a(), b() + other.b(), c() + other.c());
  }
  friend std::ostream &operator<<(std::ostream &stream, const Triangle &t) {
    return stream << "(" << t.a() << ", " << t.b() << ", " << t.c() << ")";
  }
  friend std::istream &operator>>(std::istream &stream, Triangle &t) {
    return stream >> t.a_ >> t.b_ >> t.c_;
  }
  float a() const { return a_; }
  float b() const { return b_; }
  float c() const { return c_; }
  void  a(float value) { a_ = value; }
  void  b(float value) { b_ = value; }
  void  c(float value) { c_ = value; }
 private:
  float a_;
  float b_;
  float c_;
  const static float epsilon = 0.0001;
};
 
int main(int argc, char *argv[]) {
  Triangle a(2, 2, 2), b(2, 2, 2);
  std::cout << a << " " << b << std::endl
            << (a + b) << std::endl
            << (a == b) << std::endl 
            << !a << std::endl
            << ~a << std::endl
            << (a <= b) << std::endl
            << +a << " " << +b << std::endl;
  return 0;
}
1
 Аватар для delete1991
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82
10.05.2011, 00:47  [ТС]
а можете объяснить какие операторы относятся к бинарным, а какие к унарным? и что за операторы можно использовать из бинарных в унарных, и из унарых в бинарных операторы?
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
10.05.2011, 00:50
Все операции, у которых два аргумента - бинарные. У которых один аргумент - унарные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2011, 00:50
Помогаю со студенческими работами здесь

Перегрузка операторов
Добавить целое число в очередь (operator&lt;&lt;) Взять число из очереди (operator&gt;&gt;) Студия жалуется на эту часть кода a.vector1 &gt;&gt;...

Перегрузка операторов С++
Задание: Написать код на языке С++ где реализуется перегрузка операторов. Тематика: База данных института(студенты, аспиранты,...

Перегрузка операторов
Привет, у меня есть код, но когда я его делал у меня возникла пара вопросов. #include &lt;iostream&gt; #include &lt;iomanip&gt; ...

Перегрузка операторов
Привет, не подскажите, почему у меня тут не работает правильно += оператор. #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

перегрузка операторов
на примере класса Line не получается правильно и без ошибок перегрузить следующие операторы ==, &lt;, !=, &lt;&lt;. с = и вроде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru