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

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

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

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

02.04.2013, 15:39. Просмотров 1141. Ответов 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 минут
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2013, 15:39     организация разветвленной иерархии классов
Посмотрите здесь:

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

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

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

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

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

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

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

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

Не по теме:

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

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

Не по теме:

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

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;
}
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2013, 14:11     организация разветвленной иерархии классов #11
EvengarS, судя по схеме из первого сообщения, Rectangle должен наследовать Point (а не Graph и Movable).
Правда, по той же схеме, не очень понятно, как Ellipse должен наследовать Rectangle.
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.
В принципе... это может быть эллипс, вписан в прямоугольник

Но мне даже не хочется об этом думать, иначе придется все переписывать
Tulosba
:)
Эксперт С++
4392 / 3235 / 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. Только что заметил, кто как раз конструкторы и просили написать
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 14:53  [ТС]     организация разветвленной иерархии классов #14
Так я насчет конструкторов и обратился, вроде бы сейчас только в них упирается. Не могу разобраться как правильно написать, не поможете с одним классом?
Tulosba
:)
Эксперт С++
4392 / 3235 / 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;
}
На полноту код не претендует, подправил только наиболее очевидные места. Если что не понятно, спрашивайте.
EvengarS
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 убрали. Наверное стоит все-таки оставить?
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2013, 15:51     организация разветвленной иерархии классов #17
Цитата Сообщение от EvengarS Посмотреть сообщение
Наверное стоит все-таки оставить?
Если по заданию нужно, значит нужно И с move() тогда тоже должным образом поступить.
EvengarS
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
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.04.2013, 16:05     организация разветвленной иерархии классов #19
EvengarS, вероятно нужно точку входа установить. Visual Studio?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2013, 16:07     организация разветвленной иерархии классов
Еще ссылки по теме:

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

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

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

Для описанной иерархии классов создать виртуальную функцию - C++
Здравствуйте, прошу помощи. Нужно сделать задание, при этом, вид порождения побочных классов должен быть обязательно private. Для...

Почему при создании класса у абстракных классов по иерархии пусто в _vptr ? - C++
Вот что я имею ввиду:


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

Или воспользуйтесь поиском по форуму:
EvengarS
0 / 0 / 0
Регистрация: 02.04.2013
Сообщений: 33
04.04.2013, 16:07  [ТС]     организация разветвленной иерархии классов #20
Eclipse, хотя в VS та же ошибка, но мне надо в Эклипсе
Yandex
Объявления
04.04.2013, 16:07     организация разветвленной иерархии классов
Ответ Создать тему
Опции темы

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