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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 163, средняя оценка - 4.64
RNT
Автор FAQ
3137 / 357 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
#1

Что такое композиция ? - C++

15.09.2010, 21:28. Просмотров 24575. Ответов 31
Метки нет (Все метки)

Читаю учебник Р.Лафоре "Объектно-ориентированное программирование в C++". На странице 403 пишется про композицию. Пример не приводится. Непонятно, чем композиция отличается от включения. Поясню терминологию: включение - это использование в классе объекта другого класса.

C++
1
2
3
4
5
6
7
class A 
{ };
 
class В 
{ 
    A objA; 
};
Объясните, пожалуйста, на примере, что такое композиция.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2010, 21:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Что такое композиция ? (C++):

Что такое композиция? - C++
Добрый день. Тут читаю книгу и в ней приводится длинющий и непонятный пример композиции. Попросил бы Вас привести простенький пример...

Что такое композиция?(Определение) - C++
Подскажите, пожалуйста, что такое композиция??? Мне само определение...

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? - C++
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа? - C++
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель? - C++
Что такое хэндлер файла? Что такое файловый указатель?

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них - C++
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

31
alex_x_x
бжни
2452 / 1657 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.01.2012, 13:43 #16
stawerfar, а я думал это называется вложенный класс
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 13:56 #17
Я знаю о существовании термина , но именно приведённый мною код отвечает требованиям, объяснениям в книге Лафоре т.е.:
часть может принадлежать только одному целому;
время жизни части то же, что и целого;
даже одиночный объект может относиться к классу как композиция. В машине только один двигатель.

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

Вот как-то так. Что вы скажете по этому поводу?
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
17.01.2012, 14:09 #18
stawerfar, не согласен. Теоретически двигатель от автомобиля можно к чему угодно приспособить, например, чтобы он конвейер толкал или банки консервные открывал (ведь всё, что он производит - это вращение).
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 14:15 #19
Я Вам об этом же и говорил но представите себе сам по себе двигатель ни к чему не подсоединённый который при запуске начинает "работать" но ничего полезного при этом не происходит.
Вот что я имел в введу. Для таких целей ни кто ни когда ни будет создавать подобные механизмы. Вы со мною согласны?
И именно по этой причине они не могут сами по себе существовать.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
17.01.2012, 14:19 #20
stawerfar, нет. Пока двигатель не поместили в автомобиль, он на заводе вот именно такой - голый, нерабочий. Короче, двухсоткилограммовый кусок железа. Наш код - завод. Класс "двигатель" - чертежи. А вот экземпляр класса, включённый в другой класс - это уже сам двигатель. Реальный, осязаемый, рабочий.
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 14:31 #21
Цитата Сообщение от silent_1991 Посмотреть сообщение
stawerfar, нет. Пока двигатель не поместили в автомобиль, он на заводе вот именно такой - голый, нерабочий. Короче, двухсоткилограммовый кусок железа. Наш код - завод. Класс "двигатель" - чертежи. А вот экземпляр класса, включённый в другой класс - это уже сам двигатель. Реальный, осязаемый, рабочий.
В большинстве люди спорят друг с другом из за того что говорят совершенно о разных вещях. Так вот и в нашем с Вами случае то же самое. Вы просто не "слышите" что я Вам говорю. Перечитайте моё объяснение (которое чуть выше) ещё раз и может тогда вы наконец поймёте о чём я Вам говорил.
Вдумайтесь ещё раз. Я говорил что двигатель ни кто не будет создавать лишь для того что бы он просто был. Его обязательно делают для чего-то после чего он становиться не отъемлемой частью конструкции.
То о чём говорите Вы это сборка отдельной части механизма. Но в будущем каждая часть механизма станет неотъемлемой частью. Т.е. автомобиль не поедет без двигателя , самолет не полетит без крыльев , лодка не поплывет без лопастей
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
17.01.2012, 14:37 #22
Цитата Сообщение от stawerfar Посмотреть сообщение
автомобиль не поедет без двигателя
Вот поэтому двигатель включается в автомобиль. Однако двигатель также может включаться в моторную лодку, самолёт, трактор, каток. Одна и та же деталь может использоваться в различных конструкциях. Вот поэтому Двигатель и следовало бы описать отдельно от автомобиля, а в автомобиль включить экземпляр двигателя. Потому что сегодня класс "двигатель" нужен только в автомобиле, а завтра он понадобится в лодке. И что? Рефакторинг? Или пихать в лодку класс Auto::Engine? Но чем автомобиль отличается от лодки, чтобы в автомобиле двигатель был неотъемлемой частью, а в лодку засовывали ошмёток автомобиля?
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 14:46 #23
Он отличается тем что для лодки и для автомобиля нужны разные по своей конструкции и показателям двигатели, и общего от двигатель автомобиля и двигатель лодки осталось только "слово".
Даже для разных автомобилей разные двигатели, по креплению и другим характеристикам...
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
17.01.2012, 14:53 #24
stawerfar, если настолько углубляться, то термин "повторное использование кода" надо устранить за ненадобностью. Смотря на каком уровне абстракции создаётся этот двигатель. Вы от программирования плавно перешли к вопросам крепления и механизму двигателя. Возможно, где-то понадобятся такие подробности. Но возьмём такую задачу: создаётся аркадная гонка, в которой участвуют автомобили и мотоциклы. От двигателя требуется знать только его мощность и объём. Чем тогда двигатель для автомобиля будет отличаться от двигателя для мотоцикла, если мощность и объём - поля класса?
0
stawerfar
141 / 55 / 4
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 15:02 #25
Уважаемый мой собеседник silent_1991 Вы абсолютно правы , более того я согласен с каждым "сказанным" Вами словом. Мы говорим с Вами об одном и том же только каждый объясняет с той стороны с которой о это видит. Ведь все люди индивидуальны, и это естественно. Просто я считаю это упущение со стороны автора (Лафоре) , сказал "А" говори и "Б", а то мол есть композиция - объяснил не пойми как , ни примеров ни чего толком наводящего. А мы теперь сиди и гадай.

Спасибо за интеллектуальную беседу, было очень приятно с Вами обсудить эту тему.
0
silent_1991
Эксперт С++
4997 / 3055 / 149
Регистрация: 11.11.2009
Сообщений: 7,040
Завершенные тесты: 1
17.01.2012, 15:12 #26
Цитата Сообщение от stawerfar Посмотреть сообщение
объяснил не пойми как , ни примеров ни чего толком наводящего
Выход здесь простой: если ответ не найден в одном источнике - стоит поискать другие. Наверняка в одном из них материал будет предоставлен более полно. Все источники, что попадались мне, говорили одно: композиция и включение - синонимы. Например, в математике есть такой термин - композиция функций. Так вот, можно так же сказать "суперпозиция функций", и это будет то же самое. Так что продолжаю считать, что композиция и включение - одно и то же. А описывать ли класс двигателя в классе автомобиля или отдельно от него - зависит от задачи и идеологических предпочтений. Однако не стоит забывать о повторном использовании кода.
0
Mr.X
Эксперт С++
3054 / 1699 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.01.2012, 15:36 #27
Вообще-то у Гради Буча, язык которого является одним из предшественников UML, включение по значению обозначается закрашенным квадратиком, а включение по ссылке – пустым.
Также для композиции Лафоре описывает следующие свойства:
• часть может принадлежать только одному целому;
• время жизни части то же, что и целого.
Очевидно, что эти свойства выполняются при включении по значению и не выполняются при включении по ссылке.
0
alex_x_x
бжни
2452 / 1657 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
17.01.2012, 16:10 #28
Mr.X, это же просто агрегация
0
Mr.X
Эксперт С++
3054 / 1699 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
17.01.2012, 16:26 #29
Цитата Сообщение от alex_x_x Посмотреть сообщение
Mr.X, это же просто агрегация
Да-да, и включение, и композиция - это просто виды агрегации, разницу между которыми мы тут и обсуждаем.
0
taras atavin
3883 / 1757 / 92
Регистрация: 24.11.2009
Сообщений: 27,566
17.01.2012, 17:13 #30
Цитата Сообщение от ForEveR Посмотреть сообщение
9. Что такое композиция? Тип отношения между объектами, когда один является частью другого (его членом).
Это агрегация, а композиция есть такая агрегация, при которой часть не может существовать отдельно от целого.
0
17.01.2012, 17:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2012, 17:13
Привет! Вот еще темы с ответами:

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Наследование vs Композиция vs Агрегация: что лучше выбрать? Как лучше передавать объекты в функции? - C++
Добрый день!! Дело вот в чём, я хочу создать класс, внутри которого будут созданы объекты других классов (реализованных в некоторой...

Что такое перегрузка оператора? Что у меня в коде за ошибка? - C++
Что же я написал?? Что оно не компилится? Что значит error C2275: Superclass: недопустимое использование этого типа в качестве выражения ...

В этой части кода происходит объявление функций? Что такое void? Что в скобках? - C++
В этой части кода происходит объявление функций? Что такое void? Что в скобках? void get(float **mas, int N, int M); void...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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