Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.71
delete1991
 Аватар для delete1991
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82
08.05.2011, 02:03     Перегрузка операторов #1
вот есть такое задание
Для заданного по варианту класса выполнить следующие действия:
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)

я не очень разобрался с перегрузками, плиз спасите неуча
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2011, 02:03     Перегрузка операторов
Посмотрите здесь:

C++ [c++] Перегрузка операторов
[C++] Перегрузка операторов C++
C++ Перегрузка операторов
перегрузка операторов C++
C++ перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
08.05.2011, 10:19     Перегрузка операторов #2
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! объявлено правильно. Но из объявления параметра надо убрать ссылку. Или передавать по константной ссылке - правый аргумент не изменяется.
В функции вывода из объявления параметра надо убрать ссылку. Или передавать по константной ссылке - правый аргумент не изменяется.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2011, 11:32     Перегрузка операторов #3
Цитата Сообщение от 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;
}
delete1991
 Аватар для delete1991
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82
08.05.2011, 14:46  [ТС]     Перегрузка операторов #4
Цитата Сообщение от lemegeton Посмотреть сообщение
Сообщение от delete1991
1) унарного способа перегрузки операторов. Если а=0, то тогда вывести сообщения (а относится к 1 объекту (t1))
Какой оператор-то перегружать?
Сообщение от delete1991
ну если можно сделать перегрузку оператора != чтобы он выполнял операцию в задание

Добавлено через 2 минуты
Цитата Сообщение от lemegeton Посмотреть сообщение
Сообщение от delete1991
2) бинарный способ перегрузки. Найти сумму а1+а2, т.е а первого треугольника(t1), и а второго треугольника(t2)
Что получается при суммировании треугольника и как суммировать треугольники?
я создаю же два объекта t1 и t2. в первый объект я ввожу размеры сторон a,b,c, и во второй объект я ввожу размеры сторон a,b,c. Вот мне нужно сложить сторону а первого объекта со сторой а второго объекта. МОжно ли это реализовать с помощью оператора ++
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
08.05.2011, 18:57     Перегрузка операторов #5
Цитата Сообщение от 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;
}
delete1991
 Аватар для delete1991
2 / 2 / 0
Регистрация: 05.02.2011
Сообщений: 82
10.05.2011, 00:47  [ТС]     Перегрузка операторов #6
а можете объяснить какие операторы относятся к бинарным, а какие к унарным? и что за операторы можно использовать из бинарных в унарных, и из унарых в бинарных операторы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2011, 00:50     Перегрузка операторов
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов C++
C++ Перегрузка операторов (--, +=, -=, == )

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

Или воспользуйтесь поиском по форуму:
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.05.2011, 00:50     Перегрузка операторов #7
Все операции, у которых два аргумента - бинарные. У которых один аргумент - унарные.
Yandex
Объявления
10.05.2011, 00:50     Перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 18:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru