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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 5.00
Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
#1

Взаимодействие между объектами единой иерархии классов - C++

06.03.2011, 14:17. Просмотров 1609. Ответов 4
Метки нет (Все метки)

Здравствуйте.

У меня есть некоторый базовый класс window, который создает "окно" и представляет функции доступа к нему для производных классов.
Есть базовый абстрактный класс shape (производный от window) который наследуют другие классы-фигуры (точка, линия, квадрат и т.п.)
Классы фигур, наследуя shape, выводят фигуры "на окне" класса window

Я создаю объект класс window, т.е. окно, а вот как при создании объектов фигур (dot, line, circle ...)связать эти объекты с созданным объектом window?

Предполагаю, что можно передавать сслыку на созданный объект window при создании объектов фигур, тем самым связывая их с конкретным объектом-окном.
Но как-то "многословно" получается, может есть еще способы? Чувствую, что недопонял какой-то важной особенности, когда изучал главу об иерархии классов в книге Страуструпа

Буду благодарен любой полезной информации

Добавлено через 1 час 18 минут
Я так понял необходимо использовать абстрактную фабрику.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2011, 14:17     Взаимодействие между объектами единой иерархии классов
Посмотрите здесь:
C++ Сравнение между объектами разных классов
Как организовать передачу данных между объектами разных классов? C++
Создание иерархии классов C++
Цепочка иерархии классов C++
C++ Затрудние в названии иерархии классов
организация разветвленной иерархии классов C++
C++ Реализ иерархии классов и соответствующих им методов!
C++ Связанный список для иерархии классов
C++ Найти ошибку в иерархии пользовательских классов
C++ Виртуальные функции при создании иерархии классов
Не могу написать код для иерархии классов C++
C++ указатель на void в иерархии классов. можно ли так делать?

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
06.03.2011, 15:09     Взаимодействие между объектами единой иерархии классов #2
Цитата Сообщение от Dejust Посмотреть сообщение
У меня есть некоторый базовый класс window, который создает "окно" и представляет функции доступа к нему для производных классов.
Есть базовый абстрактный класс shape (производный от window) который наследуют другие классы-фигуры (точка, линия, квадрат и т.п.)
Классы фигур, наследуя shape, выводят фигуры "на окне" класса window
Лажа какая-то. Если класс наследуется от какого-то класса, то дочерний класс логически ЯВЛЯЕТСЯ родительским.
Например, логично, что класс квадрат, порождается от класса четырехугольник. Квадрат является четырехуголником. Не очень-то логично, если класс "Фигура" порождается от класса "Окно", потому что фигура не является окном и уж тем более точка не является окном.

Предлагаю другую структуру классов.

Класс Window -- контейнер всего, что можно отрисовать, т.е НЕ является ничьим родительским классом, но содержит множество (массив / список / множество ...) объектов класса Drawable.
Класс Drowable -- класс всего, что можно отрисовать в окне. Базовый.
Класс Point : Drowable -- класс точки. Точка не является фигурой. Фигура это множество точек.
Класс Shape : Drowable -- класс фигур, контейнер множества точек.
Классы Line, Rectangle и другие наследуются от Shape.

Drowable может иметь виртуальные методы отрисовки, перекрываемые в дочерних классах.
Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
06.03.2011, 15:29  [ТС]     Взаимодействие между объектами единой иерархии классов #3
lemegeton, спасибо за пинок, без него мне никак
Так и знал, что не правильно понял суть иерархии классов

Сейчас постараюсь реализовать вашу структуру классов

Добавлено через 11 минут
Извините что туплю, но так и не понял, как связать объект-фигуру с объектом-окном..

Разве что передавать ссылку на объект-окно
C++
1
2
window wn(100,100);
line ln(point coord1, point coord2, &wn);
Существуют ли еще какие-нибудь приемы?
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
06.03.2011, 15:48     Взаимодействие между объектами единой иерархии классов #4
Конечно, я все упрощаю.
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
#include <cstdio>
#include <vector>
 
// класс, на котором все рисуется
class Canvas {
 public:
  void DrawPoint(int x, int y, int color) {
    printf("Drawing point x = %d, y = %d, color = %d.\n",
           x, y, color);
  }
  void DrawLine(int x1, int y1, int x2, int y2, int color) {
    printf("Drawing line x1 = %d, y1 = %d, x2 = %d, y2 = %d, color = %d.\n",
           x1, y1, x2, y2, color);
  }
};
 
class Window;
 
class Drawable {
 public:
  virtual void Draw(Canvas &canvas) = 0;
};
 
class Point : public Drawable {
 public:
  Point(int x, int y, int color)
   : x_(x), y_(y), color_(color) {};
  int x() const { return x_; }
  int y() const { return y_; }
  int color() const { return y_; }
  void x(int value) { x_ = value; }
  void y(int value) { y_ = value; }
  void color(int value) { color_ = value; }
  virtual void Draw(Canvas &canvas) {
    canvas.DrawPoint(x_, y_, color_);
  }
 private:
  int x_;
  int y_;
  int color_;
};
 
class Line : public Drawable {
 public:
  Line(int x1, int y1, int x2, int y2, int color)
    : x1_(x1), y1_(y1), x2_(x2), y2_(y2), color_(color) {}
  virtual void Draw(Canvas &canvas) {
    canvas.DrawLine(x1_, y1_, x2_, y2_, color_);
  }
 private:
  int x1_;
  int y1_;
  int x2_;
  int y2_;
  int color_;
};
 
class Window {
 public:
  ~Window() {
    for (int i = 0; i < drawables_.size(); ++i)
      delete drawables_[i];
  }
  void Add(Drawable *drawable) {
    drawables_.push_back(drawable);
  }
  void Draw() {
    for (int i = 0; i < drawables_.size(); ++i)
      drawables_[i]->Draw(window_canvas_);
  }
 private:
  std::vector<Drawable*> drawables_;
  Canvas window_canvas_;
};
 
 
int main(int argc, char *argv[]) {
  Window a;
  a.Add(new Point(10, 10, 0xFACE8D));
  a.Add(new Line(0, 0, 5, 5, 0xFACE8D));
  a.Draw();
  return 0;
}
Добавлено через 2 минуты
Можно еще посмотреть на иерархию классов Delphi VCL.
Dejust
49 / 49 / 1
Регистрация: 31.01.2011
Сообщений: 156
06.03.2011, 16:05  [ТС]     Взаимодействие между объектами единой иерархии классов #5
Огроменное спасибо, теперь все понятно
Yandex
Объявления
06.03.2011, 16:05     Взаимодействие между объектами единой иерархии классов
Ответ Создать тему
Опции темы

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