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

Наследование. Классы "Точка - Круг - Эллипс"

22.09.2015, 11:27. Показов 5824. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если коротко объяснять суть проблемы:
Класс tEllipse наследует от tCircle метод LineMove (который tCircle унаследовал от tPoint и переопределил). В методе LineMove вызывается функция Draw, которая разная для tCircle и tEllipse.
Как сделать так, чтобы метод LineMove вызывал рисование эллипса, а не круга?

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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <graphics.h>
#include <time.h>
 
const int N=100;
 
int random (int n) { return rand() % n; }
 
class tPoint
{
 protected:
        int x,y,c;
 public:
        int dline;
        void Draw(int,int,int);
        void Undraw();
        void LineMove();
        void Begin();
};
 
 
class tCircle : public tPoint
{
 protected:
         int r;
 public:
        void Draw(int,int,int);
        void Begin();
        void LineMove();
};
 
class tEllipse : public tCircle
{
 private:
         int a1,a2;
 protected:
         int r2;
 public:
         void Draw(int,int,int);
         void Begin();
};
 
void tPoint::Begin()
{
  dline=30;
  x=rand()%580+10;
  y=rand()%580+10;
  c=rand()%15+1;
}
 
void tCircle::Begin()
{
  tPoint::Begin();
  r=10;
}
 
void tEllipse::Begin()
{
  tCircle::Begin();
  r2=15;
  a1=0;
  a2=360;
}
 
void tPoint::Draw(int xcoord, int ycoord, int col)
{
 putpixel(xcoord,y,col);
 putpixel(xcoord+1,ycoord+1,col);  putpixel(xcoord-1,ycoord-1,col);  putpixel(xcoord-1,ycoord,col);  putpixel(xcoord+1,ycoord,col);  putpixel(xcoord,ycoord-1,col);  putpixel(xcoord,ycoord+1,col);  putpixel(xcoord+1,ycoord-1,col);  putpixel(xcoord-1,ycoord+1,col);
 return;
}
 
void tPoint::LineMove()
{
  delay(1);
  Draw(x,y,0);
  if ((x+dline)>=600||(x+dline)<=0) dline*=-1;
  x+=dline;
  Draw(x,y,c);
 return;
}
 
void tCircle::LineMove()
{
  delay(1);
  Draw(x,y,0);
  if ((x+r+dline)>=600||(x-r+dline)<=0) dline*=-1;
  x+=dline;
  Draw(x,y,c);
 return;
}
 
void tCircle::Draw(int xcoord, int ycoord, int col)
{
 setcolor(col);
 circle(xcoord,ycoord,r);
 return;
}
 
void tEllipse::Draw(int xcoord, int ycoord, int col)
{
 setcolor(col);
 ellipse(xcoord,ycoord,a1,a2,r,r2);
 return;
}
 
main ()
{
 initwindow (600,600);
 
 tPoint p[N];
 tCircle c[N];
 tEllipse e[N];
 
 srand(time(NULL));
 for (int i=0;i<N;i++) { p[i].Begin(); c[i].Begin(); e[i].Begin();}
 
while (1)
{
 setcolor (15);
 outtextxy(250,250,"Press 1 to points");
 outtextxy(250,300,"Press 2 to circles");
 outtextxy(250,350,"Press 3 to ellipse");
 switch (getch())
 {
  case'1':
  {
   cleardevice();
   while (!kbhit()) for (int i=0;i<N;i++) p[i].LineMove();
  } break;
  case'2':
  {
   cleardevice();
   while (!kbhit()) for (int i=0;i<N;i++) c[i].LineMove();
  } break;
  case'3':
  {
   cleardevice();
   while (!kbhit()) for (int i=0;i<N;i++) e[i].LineMove();
  } break;
  default: break;
 }
}
 
 getch();
 return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2015, 11:27
Ответы с готовыми решениями:

Наследование классов: реализовать классы точка, линия, треугольник, круг
задачка интересная,но как сделать ее-я не представляю... можете помочь..

Дружественные классы эллипс и круг
Здраствуйте, увадаемые форумчане помогите пожалуйста Задача. 1. Описать независимые классы и...

Классы точка, круг, элипс
Добрый вечер) начну с задания: Создать класс точка, имеющая координаты. Класс эллипсов, и класс...

Наследование. Класс Круг и класс эллипс
Здравствуйте уважаемые программисты. Нужно исправить ошибки в программе. Честно я в этом ничего не...

11
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
22.09.2015, 11:49 2
А почему рисуется круг, а не эллипс?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.09.2015, 11:51 3
Катран, Очень плохой дизайн. Круг не является точкой.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
22.09.2015, 11:52 4
ПыСы
Множественного наследования тут нет, эллипс наследовать от круга,а круг от точки как-то неправильно

Добавлено через 48 секунд
ForEveR, и тема не про множественное наследование
0
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 8
22.09.2015, 12:01  [ТС] 5
Ну вот при вызове LineMove для tEllipse рисуется круг
Мне кажется это из-за того, что LineMove не переопределена для эллипса и принадлежит кругу, и из нее вызов Draw ссылается именно на рисование круга, а не эллипса
Сама запуталась

Добавлено через 41 секунду
Да это задание чисто для развития навыков наследования, надо было сделать иерархию из геометрических фигур, вот я и нафантазировала

Добавлено через 39 секунд
А как было бы правильно?
И, раз уж я совсем туплю, в чем заключается множественное наследование?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.09.2015, 12:01 6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
и тема не про множественное наследование
Вероятно ТС думает, что цепочка наследования вида A->B->C есть множественное наследование.
Катран, множественное наследование появляется когда при объявлении класса указывают несколько базовых классов, например:
C++
1
class C : public B, public A {};
При обычной цепочке наследований (как у тебя) нет множественного наследования:
C++
1
2
3
class A {};
class B: public A {};
class C: public B {};
Про кривую иерархию уже сказали.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.09.2015, 12:01 7
Катран, Проблема в том, что у вас нет виртуальных функций. В итоге, при вызове LineMove вызывается функция Draw из конкретного класса, а не из класса наследника. Почитайте про виртуальные функции и сделайте функции которые должны быть виртуальными виртуальными.
0
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 8
22.09.2015, 12:08  [ТС] 8
ForEveR, читала про них, пыталась добавлять virtual для функций точки но результат это не изменило. Наверняка я что-то не так делаю, но путной литературы так и не нашла за два дня
Я понимаю, что вызов идет именно из класса, к которому относится функция, и это совсем никак нельзя обойти? Наверняка ведь взрослые серьезные программисты сталкивались с подобной проблемой?

Добавлено через 3 минуты
Tulosba, спасибо за разъяснение.
Если можно, я бы еще хотела понять, почему она кривая. Я из данного множества фигур (точка, отрезок, круг, прямоугольник, треугольник, эллипс, ромб) составляла цепочки наследования по принципу "у точки есть х,у и цвет, а кругу надо добавить еще радиус, значит он может наследовать от точки, только ему еще добавится радиус"
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.09.2015, 12:12 9
Лучший ответ Сообщение было отмечено Катран как решение

Решение

Катран, Просто пример с вашей иерархией:

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
#include <iostream>
 
class Point
{
public:
   virtual void draw() { std::cout << "point" << std::endl; }
   virtual void line_move() { draw(); }
};
 
class Circle : public Point
{
public:
   void draw() { std::cout << "circle" << std::endl; }
   void line_move()
   {
      std::cout << "move circle" << std::endl;
      draw();
   }
};
 
class Elipse : public Circle
{
public:
   void draw() { std::cout << "elipse" << std::endl; }
};
 
int main()
{
   Elipse e;
   e.line_move();
}
Добавлено через 1 минуту
Катран, Открытое наследование подразумевает отношение is-a. Является ли круг точкой? Нет. Тут должна использоваться композиция.
1
0 / 0 / 0
Регистрация: 10.04.2015
Сообщений: 8
22.09.2015, 12:19  [ТС] 10
ForEveR, когда делаю так

C++
1
2
3
4
5
6
7
8
9
10
class tPoint
{
 protected:
        int x,y,c;
 public:
        int dline;
        void Draw(int,int,int);
        virtual void LineMove();
        void Begin();
};
все равно рисуются круги

Добавлено через 3 минуты
ForEveR, не читайте предыдущее сообщение, я уже все поняла надо было еще рисование виртуальной сделать, а я не догадалась
Спасибо Вам большое за терпеливые ответы на мои недалекие вопросы!
А про отношение надо подумать,про такое нам еще на лекции не говорили
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
24.09.2015, 12:29 11
Цитата Сообщение от ForEveR Посмотреть сообщение
Катран, Проблема в том, что у вас нет виртуальных функций. В итоге, при вызове LineMove вызывается функция Draw из конкретного класса, а не из класса наследника. Почитайте про виртуальные функции и сделайте функции которые должны быть виртуальными виртуальными.
я не понял, а почему это так? Зачем здесь виртуальные функции? Я даже засомневался, правильно ли я их понимаю, сделал тест и всё у меня работает без виртуальных функций!
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
#include <iostream>
#include <cstdlib>
using namespace std;
class A{
public:
    void print(){cout<<"A::print();"<<endl;}
    void action(){print();}
};
class B:public A{
public:
    void print(){cout<<"B::print();"<<endl;}
    void action(){print();}
};
int main(void)
{
    setlocale(LC_ALL, "rus");
    A ta;
    B tb;
    ta.print();//A::print();
    tb.print();//B::print();
    ta.action();//A::print();
    tb.action();//B::print();
    A arr[1];
    B brr[1];
    arr[0].action();//A::print();
    brr[0].action();//B::print();
    system("pause");
    return 0;
}
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.09.2015, 14:43 12
Kuzia domovenok, У вас есть замещение фукнции action в дочернем классе. У ТС же в классе элипса нет своей замещения функции LineMove.
0
24.09.2015, 14:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 14:43
Помогаю со студенческими работами здесь

Разработать программу с использованием наследования классов, реализующую классы: точка; линия; круг
помогите написать программу: Разработать программу с использованием наследования классов,...

Разработать программу с использованием наследования классов, реализующую классы: точка; линия; круг
Разработать программу с использованием наследования классов, реализующую классы: точка; линия;...

как изобразить на экране точку, отрезок прямой, прямоугольник, круг, эллипс, ломаную линию?
напишите функцию что переводит все большие буквы в маленькие используя тернарную операцию

Создать обьект класса Круг, используя классы Точка и Окружность
Создать обьект класса Круг, используя классы Точка и Окружность. Методы: задание размеров, смена...

Используя различные фигуры (точка, линия, эллипс, круг, прямоугольник и др.) вывести в окне фигуры: домик, человечек, солнце. Фигуры должны быть запол
Используя различные фигуры (точка, линия, эллипс, круг, прямоугольник и др.) вывести в окне фигуры:...

Круг или эллипс
z = -x2 - xy - y2 +3x + 6y вместо z подставляем 4 z = 4 И устанавливаем что за линия (круг...


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

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