Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
1

Организация разветвленной иерархии классов

02.04.2013, 15:39. Показов 2283. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Цель: организовать разветвленную иерархию классов с применением абстрактных классов.

Нужна помощь в разъяснении самого задания

Добавлено через 40 минут
Кликните здесь для просмотра всего текста
Задание: создать иерархию классов:


Класс Graph должен содержать абстрактный метод draw(). Остальные классы должны его реализовывать, отображая атрибуты объектов в виде строки, например:

Точка: x=10, y=20
Прямоугольник: x=2, y=5, w=3, h=4

Абстрактный класс Movable, объявляет следующие методы:

int getX();
int getY();
void moveTo(int x, int y);

Метод moveTo() класса MyWindow помимо изменения координат должен выводить сообщение об их изменении.
Класс Point и все дочерние должны содержать метод moveTo(x, y), задающий координаты объекта, а также метод move(dx, dy), изменяющий координаты на заданную величину.
Описать в дочерних классах все необходимые атрибуты, конструкторы и методы (объекты должны иметь координаты и цвет; у класса Background есть цвет и название текстуры). Обязательно применение инкапсуляции для скрытия атрибутов.


Что вообще должна делать такая программа после запуска? Буду благодарен за максимально детальное разъяснение задания, советы по реализации (не код!).

Добавлено через 1 час 9 минут
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2013, 15:39
Ответы с готовыми решениями:

Вверх по иерархии классов
Доброго вечера, уважаемые. Помогите советом, или матюком, кто как может, все одно буду благодарен)...

Создание иерархии классов
Создать абстрактный базовый класс Struct, с виртуальными методами изменения и получения значения...

Цепочка иерархии классов
Какой доступ будет в цепочке protected - public - protected?...

Создание иерархии классов
Помогите пожалуйста! Проблема со второй частью задания :"Создать производный класс Student,...

21
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2013, 15:41 2
Цитата Сообщение от EvengarS Посмотреть сообщение
Что вообще должна делать такая программа после запуска?
После того, как вся описанная иерархия будет реализована, создаете какие-нибудь списки элементов базового класса (указатели или ссылки) и проверяете правильность вызовов переопределенных базовых методов.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
02.04.2013, 15:57  [ТС] 3
А можно более детально насчет реализации самой иерархии?
С Graph (базовый класс) и дочерними (Point, Rectangle, Circle, Ellipse) более-менее разобрался. Реализация MyWindow и Movable для меня пока не совсем понятны. С Background тоже непонятно.
Дело в том что у меня опыта в с++ ноль, и довольно сложно вникать сразу в задание такого уровня. Целый день уже читаю литературу, но многое еще непонятно, а задание надо сделать до завтра.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2013, 16:08 4
Point должен наследовать Graph и Movable. Т.е. одновременно является графическим объектом, который можно перемещать.
Background (фон) должен реализовать метод draw() как "цвет такой-то, текстура такая-то".
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
02.04.2013, 16:21  [ТС] 5
Чуть ближе, но многое еще непонятно. Поймите, я только вчера начал изучать ооп =)
Можете мне буквально разжевать что за чем?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
02.04.2013, 17:07 6
Цитата Сообщение от EvengarS Посмотреть сообщение
Поймите, я только вчера начал изучать ооп =)
Изучать по форумам - дело не благодарное. Читайте книги или сходите на википедию хотя бы.
Цитата Сообщение от EvengarS Посмотреть сообщение
Можете мне буквально разжевать что за чем?
Нет.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
02.04.2013, 17:11  [ТС] 7
Я читаю учебники, но боюсь что за день сам разобраться не успею, поэтому обратился за помощью. В любом случае спасибо за те подсказки что вы уже дали
0
Tulosba
02.04.2013, 17:18
  #8

Не по теме:

Цитата Сообщение от EvengarS Посмотреть сообщение
но боюсь что за день сам разобраться не успею
А кто сроки все продинамил? :)

0
EvengarS
02.04.2013, 17:20  [ТС]
  #9

Не по теме:

Никто, мне дали 2 дня на решение этой задачи =)

0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 14:04  [ТС] 10
Помогите написать конструкторы инициализации к классам (например для Rectangle, остальные сделаю по аналогии), ну и может будут какие-то замечания

C++ (Qt)
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
class Movable
{
public:
    virtual int getX() = 0;
    virtual int getY() = 0;
    virtual void moveTo(int, int) = 0;
    virtual ~Movable(){};
};
 
class MyWindow: public Movable
{
protected:
    int m_x, m_y;
public:
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
        // message
    }
};
 
class Graph
{
public:
    virtual void draw() = 0;
    virtual ~Graph(){};
};
 
class Point: public Graph, public Movable
{
protected:
    int m_x, m_y;
public:
    Point();
    int getX()
    {return m_x;}
    int getY()
    {return m_y;}
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
    }
    void move(int dx, int dy)
    {
        m_x+=dx;
        m_y+=dy;
    }
    void draw()
    {
        cout << "Point: x = " << m_x << ", y = " << m_y;
    }
};
 
class Rectangle: public Graph, public Movable
{
protected:
    int m_x, m_y, m_w, m_h;
public:
    Rectangle();
    int getX()
    {return m_x;}
    int getY()
    {return m_y;}
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
    }
    void move(int dx, int dy)
    {
        m_x+=dx;
        m_y+=dy;
    }
    void setSize(int w, int h)
    {
        m_w = w;
        m_h = h;
    }
    void draw()
    {
        cout << "Rectangle: x = " << m_x << ", y = " << m_y << "w = " << m_w << "h = " << m_h;
    }
};
 
class Circle: public Graph, public Movable
{
protected:
    int m_x, m_y, m_r;
public:
    Circle();
    int getX()
    {return m_x;}
    int getY()
    {return m_y;}
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
    }
    void move(int dx, int dy)
    {
        m_x+=dx;
        m_y+=dy;
    }
    void setRadius(int r)
    {
        m_r = r;
    }
    void draw()
    {
        cout << "Circle: x = " << m_x << ", y = " << m_y << "r = " << m_r;
    }
};
 
class Ellipse: public Graph, public Movable
{
protected:
    int m_x, m_y, m_w, m_h;
public:
    Ellipse();
    int getX()
    {return m_x;}
    int getY()
    {return m_y;}
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
    }
    void move(int dx, int dy)
    {
        m_x+=dx;
        m_y+=dy;
    }
    void setSize(int w, int h)
    {
        m_w = w;
        m_h = h;
    }
    void draw()
    {
        cout << "Ellipse: x = " << m_x << ", y = " << m_y << "d1 = " << m_w << "d2 = " << m_h;
    }
};
 
class Background: public Graph
{
    void draw()
    {
        //
    }
};
 
 
void Main()
{
    Graph* ptr1 = new Point;
    Graph* ptr2 = new Rectangle;
    Graph* ptr3 = new Circle;
    Graph* ptr4 = new Ellipse;
        ptr1->draw();
        ptr2->draw();
        ptr3->draw();
        ptr4->draw();
        delete ptr1;
        delete ptr2;
        delete ptr3;
        delete ptr4;
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.04.2013, 14:11 11
EvengarS, судя по схеме из первого сообщения, Rectangle должен наследовать Point (а не Graph и Movable).
Правда, по той же схеме, не очень понятно, как Ellipse должен наследовать Rectangle.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 14:23  [ТС] 12
Это действительно выглядит нелогично, я решил что Point, Rectangle, Circle и Ellipse должны наследовать Graph и Movable, по крайней мере это имеет смысл, Graph содержит абстрактный метод draw(), Movable содержит абстрактные методы getX(), getY() и moveTo(int x, int y), а остальные классы их реализуют.
Если предположить, что моя интерпретация схемы верна, что скажете насчет кода?

Добавлено через 2 минуты
Цитата Сообщение от Tulosba Посмотреть сообщение
не очень понятно, как Ellipse должен наследовать Rectangle.
В принципе... это может быть эллипс, вписан в прямоугольник

Но мне даже не хочется об этом думать, иначе придется все переписывать
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.04.2013, 14:52 13
Цитата Сообщение от EvengarS Посмотреть сообщение
я решил что Point, Rectangle, Circle и Ellipse должны наследовать Graph и Movable
Это так. Только вот Rectangle, Circle и Ellipse должны опираться на Point. Т.е. вносится дополнительный уровень зависимости.
Цитата Сообщение от EvengarS Посмотреть сообщение
Если предположить, что моя интерпретация схемы верна, что скажете насчет кода?
Члены класса лучше сделать private ( int m_x, m_y и прочее).
Конструкторы не определены для классов.
И вообще, Вы код почему не проверяете? Он же даже не собирается.

Добавлено через 4 минуты
P.S. Только что заметил, кто как раз конструкторы и просили написать
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 14:53  [ТС] 14
Так я насчет конструкторов и обратился, вроде бы сейчас только в них упирается. Не могу разобраться как правильно написать, не поможете с одним классом?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.04.2013, 15:10 15
EvengarS, вот, прибрался немного. В изначальном коде много дублирования было. Видимо, Вы не совсем осознали концепции ООП (не нужно писать одно и то же в разных связанных классах).
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
 
using namespace std;
 
class Movable
{
public:
    virtual void moveTo(int, int) = 0;
    virtual void move(int, int) = 0;
    virtual ~Movable(){};
};
 
class MyWindow: public Movable
{
private:
    int m_x, m_y;
public:
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
        // message
    }
};
 
class Graph
{
public:
    virtual void draw() = 0;
    virtual ~Graph(){};
};
 
class Point: public Graph, public Movable
{
private:
    int m_x, m_y;
public:
    Point( int x, int y): m_x(x), m_y(y) {}
    int getX()
    {return m_x;}
    int getY()
    {return m_y;}
    void moveTo(int x, int y)
    {
        m_x = x;
        m_y = y;
    }
    void move(int dx, int dy)
    {
        m_x+=dx;
        m_y+=dy;
    }
    void draw()
    {
        cout << "Point: x = " << m_x << ", y = " << m_y;
    }
};
 
class Rectangle: public Point
{
private:
    int m_w, m_h;
public:
    Rectangle(int x, int y, int w, int h) : Point( x, y), m_w(w), m_h(h) {}
    void setSize(int w, int h)
    {
        m_w = w;
        m_h = h;
    }
    int getW()
    {return m_w;}
    int getH()
    {return m_h;}
    void draw()
    {
        cout << "Rectangle: x = " << getX() << ", y = " << getY() << "w = " << m_w << "h = " << m_h;
    }
};
 
class Circle: public Point
{
private:
    int m_r;
public:
    Circle( int x, int y, int r ): Point( x, y ), m_r(r) {}
    void setRadius(int r)
    {
        m_r = r;
    }
    void draw()
    {
        cout << "Circle: x = " << getX() << ", y = " << getY() << "r = " << m_r;
    }
};
 
class Ellipse: public Rectangle
{
public:
    Ellipse( int x, int y, int w, int h) : Rectangle( x, y, w, h) {} 
    void draw()
    {
        cout << "Ellipse: x = " << getX() << ", y = " << getY() << "d1 = " << getW() << "d2 = " << getH();
    }
};
 
class Background: public Graph
{
    void draw()
    {
        //
    }
};
 
 
int main()
{
    Graph* ptr1 = new Point(10,20);
    Graph* ptr2 = new Rectangle(30,40,50,60);
    Graph* ptr3 = new Circle(70,80,90);
    Graph* ptr4 = new Ellipse(100,110,120,130);
        ptr1->draw();
        ptr2->draw();
        ptr3->draw();
        ptr4->draw();
        delete ptr1;
        delete ptr2;
        delete ptr3;
        delete ptr4;
}
На полноту код не претендует, подправил только наиболее очевидные места. Если что не понятно, спрашивайте.
1
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 15:43  [ТС] 16
Так вроде бы все понятно, спасибо, только один вопрос, в задании говорится "Абстрактный класс Movable, объявляет следующие методы:
int getX();
int getY();
void moveTo(int x, int y);"

а Вы getX() и getY() из Movable убрали. Наверное стоит все-таки оставить?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.04.2013, 15:51 17
Цитата Сообщение от EvengarS Посмотреть сообщение
Наверное стоит все-таки оставить?
Если по заданию нужно, значит нужно И с move() тогда тоже должным образом поступить.
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 16:02  [ТС] 18
А у Вас компилируется? Вроде бы в коде ошибок нет уже, но что-то не идет...
undefined reference to `WinMain@16'
collect2.exe: error: ld returned 1 exit status
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
04.04.2013, 16:05 19
EvengarS, вероятно нужно точку входа установить. Visual Studio?
0
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 16:07  [ТС] 20
Eclipse, хотя в VS та же ошибка, но мне надо в Эклипсе
0
04.04.2013, 16:07
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2013, 16:07
Помогаю со студенческими работами здесь

Затрудние в названии иерархии классов
Здравствуйте камрады. Помогите обозвать иерархию классов, в голову ничего толкового не приходит....

Главный в иерархии классов класс
Какой главный в иерархии классов класс в C++? Вот в C# - это System.Object.

Найти ошибку в иерархии пользовательских классов
Есть класс &quot;Дата&quot;, есть класс &quot;Работник&quot; который имеет поле &quot;Дата&quot;, и есть класс &quot;Компания&quot;...

Права доступа к переменным в иерархии классов
class Base{ public: int a; protected: int b; private: int c; }; class...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru