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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
#1

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

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

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

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

Добавлено через 40 минут
Кликните здесь для просмотра всего текста
Задание: создать иерархию классов:
http://s2.ipicture.ru/uploads/20130402/F2uq4R78.png

Класс 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2013, 15:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос организация разветвленной иерархии классов (C++):

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

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

Затрудние в названии иерархии классов - C++
Здравствуйте камрады. Помогите обозвать иерархию классов, в голову ничего толкового не приходит. struct Card1 { std::string...

Связанный список для иерархии классов - C++
Есть иерархия классов точка->треугольник->треугольник в треугольнике. Всю эту муть нужно хранить в связанном списке. Как я понял, если...

Реализ иерархии классов и соответствующих им методов! - C++
Привет всем! Срочно нужна помощь в написании программы! Необходимо реализовать иерархию таких классов, как Точка - Единичный вектор -...

Найти ошибку в иерархии пользовательских классов - C++
Есть класс "Дата", есть класс "Работник" который имеет поле "Дата", и есть класс "Компания" который включает в себя массив работников. В...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.04.2013, 15:41 #2
Цитата Сообщение от EvengarS Посмотреть сообщение
Что вообще должна делать такая программа после запуска?
После того, как вся описанная иерархия будет реализована, создаете какие-нибудь списки элементов базового класса (указатели или ссылки) и проверяете правильность вызовов переопределенных базовых методов.
0
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
02.04.2013, 15:57  [ТС] #3
А можно более детально насчет реализации самой иерархии?
С Graph (базовый класс) и дочерними (Point, Rectangle, Circle, Ellipse) более-менее разобрался. Реализация MyWindow и Movable для меня пока не совсем понятны. С Background тоже непонятно.
Дело в том что у меня опыта в с++ ноль, и довольно сложно вникать сразу в задание такого уровня. Целый день уже читаю литературу, но многое еще непонятно, а задание надо сделать до завтра.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.04.2013, 16:08 #4
Point должен наследовать Graph и Movable. Т.е. одновременно является графическим объектом, который можно перемещать.
Background (фон) должен реализовать метод draw() как "цвет такой-то, текстура такая-то".
0
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
02.04.2013, 16:21  [ТС] #5
Чуть ближе, но многое еще непонятно. Поймите, я только вчера начал изучать ооп =)
Можете мне буквально разжевать что за чем?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.04.2013, 17:07 #6
Цитата Сообщение от EvengarS Посмотреть сообщение
Поймите, я только вчера начал изучать ооп =)
Изучать по форумам - дело не благодарное. Читайте книги или сходите на википедию хотя бы.
Цитата Сообщение от EvengarS Посмотреть сообщение
Можете мне буквально разжевать что за чем?
Нет.
0
EvengarS
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
EvengarS
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
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2013, 14:11 #11
EvengarS, судя по схеме из первого сообщения, Rectangle должен наследовать Point (а не Graph и Movable).
Правда, по той же схеме, не очень понятно, как Ellipse должен наследовать Rectangle.
0
EvengarS
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
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 14:53  [ТС] #14
Так я насчет конструкторов и обратился, вроде бы сейчас только в них упирается. Не могу разобраться как правильно написать, не поможете с одним классом?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 15:10
Привет! Вот еще темы с ответами:

Взаимодействие между объектами единой иерархии классов - C++
Здравствуйте. У меня есть некоторый базовый класс window, который создает &quot;окно&quot; и представляет функции доступа к нему для производных...

Не могу написать код для иерархии классов - C++
Классы: Кафедра, Студент, Персона, Группа, Подразделение, Преподаватель Запросы: • перечень студентов в указанной группе; • перечень...

Виртуальные функции при создании иерархии классов - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; class var{ int temperatura; float shirina; public: virtual...

указатель на void в иерархии классов. можно ли так делать? - C++
здравствуйте! Такое дело: мне нужно написать иерархию классов для работы с таблицей. базовый класс - это просто таблица, а производный...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
04.04.2013, 15:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru