Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для Dejust
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте.

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

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

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

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

Добавлено через 1 час 18 минут
Я так понял необходимо использовать абстрактную фабрику.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2011, 14:17
Ответы с готовыми решениями:

Сравнение между объектами разных классов
Всем привет, Есть 4 разных класса, в мэине мне нужно их сравнить. Например: A a; B b; if(a==b) dosomething();Можно ли...

Как организовать передачу данных между объектами разных классов?
Есть объект doc в нутрии него создается еще два объекта ui и engine, engine в свою очередь создает еще один объект obj. Вопрос, как из ui...

Взаимодействие между объектами разных классов
Ребят, не могу найти как сделать. Например: есть два класса. Зергушонок и Недозилок, у которых есть свои данные. И нужно реализовать...

4
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
06.03.2011, 15:09
Цитата Сообщение от Dejust Посмотреть сообщение
У меня есть некоторый базовый класс window, который создает "окно" и представляет функции доступа к нему для производных классов.
Есть базовый абстрактный класс shape (производный от window) который наследуют другие классы-фигуры (точка, линия, квадрат и т.п.)
Классы фигур, наследуя shape, выводят фигуры "на окне" класса window
Лажа какая-то. Если класс наследуется от какого-то класса, то дочерний класс логически ЯВЛЯЕТСЯ родительским.
Например, логично, что класс квадрат, порождается от класса четырехугольник. Квадрат является четырехуголником. Не очень-то логично, если класс "Фигура" порождается от класса "Окно", потому что фигура не является окном и уж тем более точка не является окном.

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

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

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

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

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

Разве что передавать ссылку на объект-окно
C++
1
2
window wn(100,100);
line ln(point coord1, point coord2, &wn);
Существуют ли еще какие-нибудь приемы?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
06.03.2011, 15:48
Конечно, я все упрощаю.
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.
2
 Аватар для Dejust
49 / 49 / 4
Регистрация: 31.01.2011
Сообщений: 156
06.03.2011, 16:05  [ТС]
Огроменное спасибо, теперь все понятно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2011, 16:05
Помогаю со студенческими работами здесь

Взаимодействие между 3д объектами
Здравствуйте! Создаю 3д модель. И вот нужно, чтобы некий кран мог перетаскивать пластины с помощью присосок. Пластины в разных частях...

Взаимодействие между объектами в классах
Здрасте! У меня есть прога для регулирования расходов, в которой есть класс Account и класс Category. Есть ещё классы ManageAccounts(для...

Взаимодействие между объектами конфигурации
Всем добрый день, Начал изучать 1С по принципу &quot;вот &quot;живой проект&quot; и ты его должен реализовать&quot; (да, я его сам придумал на коленке)....

Как организовать взаимодействие между объектами
В панели динамически создаю textBox (для примера) private void button1_Click(object sender, EventArgs e) { ...

Как наглядно представить код в виде иерархии классов и связей между ними
Желательно видеть как внутренние связи, между всеми методами, в том числе и обращения к переменным, так и внешние, между всеми элементами....


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru