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

Работа с классами и перегрузка операций - C++

Восстановить пароль Регистрация
 
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
13.05.2012, 22:19     Работа с классами и перегрузка операций #1
Доброго времени суток, форумчане.
Есть вот такое задание:
1. Класс "прямоугольник": координаты верхнего левого и нижнего правого углов, порядковый номер.
2. Потомки: "ромб"(длина второй диагонали) и "круг" (центр - первые две координаты, диаметр - диагональ прямоугольника). В базовом и производных классах определить функцию draw().
3. Перегрузить унарную операцию "--" - как уменьшение на 1 размера фигуры, бинарную C = A + B - как дублирование в С объекта А с увеличением диагонали на размер диагонали В
Вот с этим самым 3м пунктом и возникли сложности - не могу понять как сделать перегрузку операции "+".
Вот код всего остального:
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
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<math.h>
#pragma hdrstop
#pragma argsused
 
class Rectangle
{
        private:
        int num;
        public:
        float x1,x2,y1,y2;
 
        Rectangle(){}
        Rectangle(float _x1,float _y1,float _x2,float _y2,int _num)
        {
                x1 = _x1;
                y1= _y1;
                x2 = _x2;
                y2 = _y2;
                num = _num;
        }
        void draw();
        void operator--()
        {
                --x2;
                --y2;
        }
};
 
//---------------------------------------------------------------------------
class Romb : public Rectangle
{
private:
        float SecondDiag;
public:
        Romb(Rectangle R1, float _SecondDiag)
        {
                x1 = R1.x1;
                y1 = R1.y1;
                x2 = R1.x2;
                y2 = R1.y2;
                SecondDiag = _SecondDiag;
 
        }
        void draw();
        void operator--()
        {
                --SecondDiag;
        }
 };
 
 class Circle : public Rectangle
 {
 public:
        float X;
        float Y;
        float D;
        double n,m;
        Circle(){}
        Circle(Rectangle R1)
        {
                X = R1.x1;
                Y = R1.y1;
                n = pow((R1.x2-R1.x1),2);
                m = pow((R1.y2 - R1.y1),2);
                D = sqrt(n+m);
        }
        void draw();
        void operator--()
        {
                --D;
        }
 
 };
 
        void Rectangle::draw()
        {
                printf("Rectangle \n\n");
                printf("Koordinati pervou to4ki\n");
                cout<<"x = "<<x1<<endl;
                cout<<"y = "<<y1<<endl;
                printf("Koordinati vtorou to4ki\n");
                cout<<"x = "<<x2<<endl;
                cout<<"y = "<<y2<<endl;
                cout<<"Porjadkoviu nomer= "<<num<<"\n\n"<<endl;
 
        }
        void Romb::draw()
        {
                printf("Romb\n\n");
                cout<<"Vtoraja diagonal'= "<<SecondDiag<<endl<<endl;
 
        }
        void Circle::draw()
        {
                printf("CIRCLE\n\n");
                printf("koordinaty centra \n");
                cout<<"X= "<<X<<endl;
                cout<<"Y= "<<Y<<"\n"<<endl;
                cout<<"Diametr= "<<D<<endl;
 
        }
и
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
#include<conio.h>
#include<iostream.h>
#include<stdio.h>
#pragma hdrstop
#pragma argsused
#include "H:\Lab4cpp\Rectangle.h"
//---------------------------------------------------------------------------
 
int main(int argc,char* argv[])
{
         Rectangle R1(4,1,15,10,1);
         R1.draw();
         Romb R2(R1,5);
         R2.draw();
         Circle C1(R1);
         C1.draw();
         --R1;
         printf("-- Rectangle\n\n");
         R1.draw();
         printf(" -- Romb\n\n");
         --R2;
         R2.draw();
         printf(" -- Circle\n\n");
         --C1;
         C1.draw();
 
         getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 22:19     Работа с классами и перегрузка операций
Посмотрите здесь:

C++ Перегрузка операций
C++ Робота с классами и перегрузка функций
C++ Программа с классами комплексных чисел и перегрузками операций
Перегрузка операций C++
C++ перегрузка операций
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 22:41     Работа с классами и перегрузка операций #2
Оператор инкремента должен возвращать ссылку на объект класса.
Примерно так:
C++
1
2
3
4
5
6
Rectangle& operator--()
        {
                --x2;
                --y2;
                return *this;
        }
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
13.05.2012, 22:45  [ТС]     Работа с классами и перегрузка операций #3
Цитата Сообщение от antoha398 Посмотреть сообщение
Оператор инкремента должен возвращать ссылку на объект класса.
Примерно так:
C++
1
2
3
4
5
6
Rectangle& operator--()
        {
                --x2;
                --y2;
                return *this;
        }
C этим проблем нет - всё работает и никаких предупреждений не выдаёт. Да и препод эту часть проверил. Осталось сделать "+".
И, если честно, я не пойму чем плох мой код.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
13.05.2012, 23:01     Работа с классами и перегрузка операций #4
Цитата Сообщение от IIe4eNbku Посмотреть сообщение
И, если честно, я не пойму чем плох мой код.
Я не говорю, что он плох. Просто правильней делать поведение операторов для своего класса таким же как для встроенных типов.

Например
Цитата Сообщение от IIe4eNbku Посмотреть сообщение
--R2;
R2.draw();
Можно бы было заменить на
C++
1
--R2.draw();
Добавлено через 8 минут
Я вам приведу пример, как можно перегрузить оператор суммы, кто-то может покажет и другой вариант.
C++
1
2
3
4
5
6
Rectangle operator+ (const Rectangle& lhs, const Rectangle& rhs)
{
   Rectangle  tmp(lhs);
   // прибавляем к членам tmp соответственные члены rhs
   return tmp;
}
Для этого варианта возможно понадобиться конструктор копирования(хотя и синтезируемый сойдет)
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
14.05.2012, 16:19  [ТС]     Работа с классами и перегрузка операций #5
Цитата Сообщение от antoha398 Посмотреть сообщение
Я вам приведу пример, как можно перегрузить оператор суммы, кто-то может покажет и другой вариант.
C++
1
2
3
4
5
6
Rectangle operator+ (const Rectangle& lhs, const Rectangle& rhs)
{
   Rectangle  tmp(lhs);
   // прибавляем к членам tmp соответственные члены rhs
   return tmp;
}
Для этого варианта возможно понадобиться конструктор копирования(хотя и синтезируемый сойдет)
Спасибо, конечно, но я никак не могу понять как применить это в своём задании. Вторую неделю бьюсь уже с перегрузкой +.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
14.05.2012, 18:49     Работа с классами и перегрузка операций #6
Я не стал разбираться с диагоналями, просто сложил координаты класса прямоугльника.
Вот реализация оператора суммы:
C++
1
2
3
4
5
6
7
8
9
Rectangle operator+(const Rectangle& lhs, const Rectangle& rhs)
{
    Rectangle ret(lhs);
    ret.x1 = lhs.x1 + rhs.x1;
    ret.x2 = lhs.x2 + rhs.x2;
    ret.y1 = lhs.y1 + rhs.y1;
    ret.y2 = lhs.y2 + rhs.y2;
    return ret;
}
Эта функция не член класса.
В классе только объявляете ее дружественной под маркером паблик:
C++
1
2
3
4
5
6
class Rectangle
{
public:
friend Rectangle operator+(const Rectangle&, const Rectangle&);
//....
};
Таким же образом перегружаете для остальных классов.

Надеюсь теперь это то, что вам надо=)
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
14.05.2012, 19:46  [ТС]     Работа с классами и перегрузка операций #7
Цитата Сообщение от antoha398 Посмотреть сообщение
Таким же образом перегружаете для остальных классов.

Надеюсь теперь это то, что вам надо=)
Спасибо за помощь, сейчас буду разбираться.
zss
Модератор
Эксперт С++
 Аватар для zss
5943 / 5548 / 1783
Регистрация: 18.12.2011
Сообщений: 14,171
Завершенные тесты: 1
14.05.2012, 20:01     Работа с классами и перегрузка операций #8
Можно перегрузить и как метод класса:
C++
1
2
3
4
5
6
7
8
9
Rectangle Rectangle::operator+(const Rectangle& rhs)
{
    Rectangle ret(*this);
    ret.x1 += rhs.x1;
    ret.x2 += rhs.x2;
    ret.y1 += rhs.y1;
    ret.y2 += rhs.y2;
    return ret;
}
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
15.05.2012, 18:08  [ТС]     Работа с классами и перегрузка операций #9
И ещё один вопрос. Как потом это использовать в коде?вызвать т.е.
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
15.05.2012, 20:18     Работа с классами и перегрузка операций #10
Цитата Сообщение от IIe4eNbku Посмотреть сообщение
И ещё один вопрос. Как потом это использовать в коде?вызвать т.е.
как и задумывалось=)
C++
1
2
3
4
Rectangle Rec1(4, 5, 6, 7, 1);
Rectangle Rec2(4, 5, 6, 7, 2);
Rectangle Rec3;
Rec3 = Rec1 + Rec2;
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
20.05.2012, 19:42  [ТС]     Работа с классами и перегрузка операций #11
Недавно только руки дошли до доделывания задания. Получился ужасный быдлокод. Кто хочет - может ознакомиться (сильно не пинайте):
C++
1
2
3
4
5
6
friend Romb operator+(const Romb& L,const Romb& R)
        {
             Romb rmb(L);
             rmb.SecondDiag = (L.SecondDiag + R.SecondDiag)+1;
             return rmb;
        }
и в мейне
C++
1
2
3
4
5
//A - R2
         Romb rmb(R1,0); // This is C , create rmb with "null" @SecodnDiag@
         Romb rmb2(R1,5);  //This is B
         rmb = R2 + rmb2;
         rmb.draw();
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
20.05.2012, 20:06     Работа с классами и перегрузка операций #12
Цитата Сообщение от IIe4eNbku Посмотреть сообщение
Получился ужасный быдлокод.
Зачем такая самокритика. Все нормально.

Только непонятно почему +1 ?
Цитата Сообщение от IIe4eNbku Посмотреть сообщение
rmb.SecondDiag = (L.SecondDiag + R.SecondDiag)+1;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 20:09     Работа с классами и перегрузка операций
Еще ссылки по теме:

Перегрузка операций C++
Перегрузка операций C++
C++ Перегрузка операций

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

Или воспользуйтесь поиском по форуму:
IIe4eNbku
8 / 8 / 0
Регистрация: 06.12.2011
Сообщений: 76
20.05.2012, 20:09  [ТС]     Работа с классами и перегрузка операций #13
Цитата Сообщение от antoha398 Посмотреть сообщение
Зачем такая самокритика. Все нормально.

Только непонятно почему +1 ?
А без этого "+1" выводило значение на 1 меньше, чем должно было
Yandex
Объявления
20.05.2012, 20:09     Работа с классами и перегрузка операций
Ответ Создать тему
Опции темы

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