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

Классы, включающие другие классы - C++

Восстановить пароль Регистрация
 
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
18.10.2012, 02:48     Классы, включающие другие классы #1
Столкнулся вот с таким кодом:
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
#include <iostream>
class Point
{
public:
    void SetX(int x)  {itsX = x;}
    void SetY(int y)  {itsY = y;}
    int GetX()  {return itsX;}
    int GetY()  {return itsY;}
private:
    int itsX;
    int itsY;
};
class Rectangle
{
public:
    Rectangle (int top, int left, int bottom, int right);
    ~Rectangle() {}
    int GetTop()  {return itsTop;}
    int GetLeft()  {return itsLeft;}
    int GetBottom()  {return itsBottom;}
    int GetRight()  {return itsRight;}
    Point GetUpperLeft()   {return itsUpperLeft;}
    Point GetLowerLeft()   { return itsLowerLeft;}   
    Point GetUpperRight()   {return itsUpperRight;}
    Point GetLowerRight()   {return itsLowerRight;}
    void SetUpperLeft (Point Location)  {itsUpperLeft = Location;}
    void SetLowerLeft (Point Location) { itsLowerLeft = Location;}
    void SetUpperRight (Point Location) {itsUpperRight = Location;}
    void SetLowerRight (Point Location) {itsLowerRight = Location;}
    void SetTop (int top)  { itsTop = top;}
    void SetLeft (int left)  {itsLeft = left;}
    void SetBottom (int bottom) {itsBottom = bottom;}
    void SetRight (int right)  {itsRight = right;}
    int GetArea ();
private:
    Point itsUpperLeft;
    Point itsLowerLeft;
    Point itsUpperRight;
    Point itsLowerRight;
    int itsTop;
    int itsLeft;
    int itsBottom;
    int itsRight;
};
Rectangle::Rectangle(int top, int left, int bottom, int right)
{
    itsTop = top;
    itsLeft = left;
    itsBottom = bottom;
    itsRight = right;
    itsUpperLeft.SetX(left);
    itsUpperLeft.SetY(top);
    itsUpperRight.SetX(right);
    itsUpperRight.SetY(top);
    itsLowerLeft.SetX(left);
    itsLowerLeft.SetY(bottom);
    itsLowerRight.SetX(right);
    itsLowerRight.SetY(bottom);
}
int Rectangle::GetArea()
{
    int Widht = itsRight - itsLeft;
    int Height = itsTop - itsBottom;
    return (Widht * Height);
}
int main()
{
    Rectangle MyRectangle (100, 20, 50, 80);
    int Area = MyRectangle.GetArea();
    cout << "Area: " << Area << '\n';
    cout << "Upper Left X Coordinate: ";
    cout << MyRectangle.GetUpperLeft().GetX();
    return 0;
}
Вроде все скомпилировалось нормально, непонятно только какую полезную функцию здесь выполняет следующий фрагмент кода:
C++
1
2
3
4
5
6
7
8
    void SetUpperLeft (Point Location) {itsUpperLeft = Location;}
    void SetLowerLeft (Point Location) {itsLowerLeft = Location;}
    void SetUpperRight (Point Location) {itsUpperRight = Location;}
    void SetLowerRight (Point Location) {itsLowerRight = Location;}
    void SetTop (int top)  {itsTop = top;}
    void SetLeft (int left)  {itsLeft = left;}
    void SetBottom (int bottom) {itsBottom = bottom;}
    void SetRight (int right)  {itsRight = right;}
Ведь если я правильно понимаю, он устанавливает координаты четырех точек объекта класса Rectangle. Но ведь ту же самую функцию выполняет и конструктор? Я попытался убрать эту часть кода и перекомпилировать, результат получился тот же самый. Одним словом, объясните, есть ли тут смысл или это просто некорректный код.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.10.2012, 02:48     Классы, включающие другие классы
Посмотрите здесь:

C++ Классы
C++ классы
Классы C++
Классы С++ C++
C++ Классы в С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,280
18.10.2012, 08:49     Классы, включающие другие классы #2
конструктор выполняет ту же самую функцию при инициализации. если вам необходимо изменить данные поля объекта после его создания у вас два пути - через создание еще одного объекта с нужными вам значениями полей при помощи конструктора и присваивание его существующему объекту (некрасиво, лишняя работа и не всегда возможно) или модификация нужных вам полей при помощи этих самых функций.
svpol
0 / 0 / 0
Регистрация: 13.10.2012
Сообщений: 9
18.10.2012, 10:00  [ТС]     Классы, включающие другие классы #3
Цитата Сообщение от vxg Посмотреть сообщение
конструктор выполняет ту же самую функцию при инициализации. если вам необходимо изменить данные поля объекта после его создания у вас два пути - через создание еще одного объекта с нужными вам значениями полей при помощи конструктора и присваивание его существующему объекту (некрасиво, лишняя работа и не всегда возможно) или модификация нужных вам полей при помощи этих самых функций.
А разве недостаточно для этого только последние четыре строки.
C++
1
2
3
4
5
    
void SetTop (int top)  {itsTop = top;}
void SetLeft (int left)  {itsLeft = left;}
 void SetBottom (int bottom) {itsBottom = bottom;}
 void SetRight (int right)  {itsRight = right;}
И что это за загадочный атрибут Point Location? То есть понятно, зачем он нужен, но если возникнет необходимость, как мне практически изменить данные, допустим, с помощью ф-ции void SetUpperLeft (Point Location)? Что я должен подставить вместо этого Point Location? Ведь у объекта типа Point два значения, а у тут только один.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
18.10.2012, 10:20     Классы, включающие другие классы #4
Цитата Сообщение от svpol Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
private:
    Point itsUpperLeft;
    Point itsLowerLeft;
    Point itsUpperRight;
    Point itsLowerRight;
    int itsTop;
    int itsLeft;
    int itsBottom;
    int itsRight;
Дублируемая информация. Первые четыре поля не нужны. К тому же, методы-мутаторы (Set...) неправильно их обновляют.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
18.10.2012, 10:43     Классы, включающие другие классы #5
Прямоугольник имеет 4 точки, каждая из которых определяется 2мя координатами. Наверное, это имелось ввиду в классе прямоугольника. Что такое top, left, bottom и right - загадка.
vxg
Модератор
 Аватар для vxg
2669 / 1680 / 158
Регистрация: 13.01.2012
Сообщений: 6,280
18.10.2012, 12:53     Классы, включающие другие классы #6
Point Location - это не атрибут это объект Location класса Point - мы передаем в функцию в качестве аргумента объект-точку, внутри функции эта точка присваивается некоторому полю сокрытому в нашем классе. как отметили Кот Ангенс и John Prick с классом прямоугольника что то намудрено - он описан два раза - в виде собственно точек и в виде границ по осям. не исключено что это было сделано преднамеренно для того что бы иметь под рукой данные нужного формата - например, человек знает что в программе очень много вызовов будут требовать в качестве данных объект-точку, а другая гора вызовов - границы. вот он и заложил представление одной и той же информации в нескольких формах. но это очень специфическое решение и на то должны были быть веские основания... хотя, может мы просто придумываем то чего нет на самом деле и объекты-точки представляют собой координаты в системе координат модели, а границы - координаты в оконной системе координат. поэтому они и обновляются отдельно и никак не влияют друг на друга.
Yandex
Объявления
18.10.2012, 12:53     Классы, включающие другие классы
Ответ Создать тему
Опции темы

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