Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/145: Рейтинг темы: голосов - 145, средняя оценка - 4.86
RNT
Автор FAQ
3138 / 358 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
1

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

15.09.2010, 21:28. Просмотров 26570. Ответов 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
Ответы с готовыми решениями:

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

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

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

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

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

31
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.09.2010, 02:14 2
Композиция (Нужна подсказка)
9. Что такое композиция?
Тип отношения между объектами, когда один является частью другого (его членом).
Композиция
0
RNT
Автор FAQ
3138 / 358 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
16.09.2010, 14:07  [ТС] 3
Lavroff, во второй ссылке, которую вы указали, описывается композиция в дизайне, а не в программировании.

Чем отличается композиция в теме Композиция (Нужна подсказка) от включения ?

Код из темы Композиция (Нужна подсказка)
Цитата Сообщение от Alexen Посмотреть сообщение
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
class Point
{
 friend ostream &operator<<(ostream &, const Point &);
        public:
          Point (float = 0, float = 0);
          void setPoint(float, float);
          float getX() const {return x;}
          float getY() const {return y;}
        private:
          float x,y;
};
 
 
class Circle
{
 friend ostream &operator<<(ostream &, const Circle &);
        public:
                Circle(float=0, float=0, float=0);
                void setRadius(float);
                float getRadius() const {return radius;}
                float getArea() const;
        private:
        Point rPoint;
        float radius;
};
 
class Culinder
{
friend ostream &operator<<(ostream &, const Culinder &);
        public:
        Culinder(float=0, float=0, float=0, float=0);
        void setHeight(float);
        float getHeight () const{return height;}
        float getArea() const;
        float volume() const;
 
  private:
  Circle cCircle;
  float height;
 
}
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.09.2010, 14:20 4
RNT, Есть непосредственно такой метод "Включение"? По-моему сие эквивалентно... То есть композиция - включение объекта другого класса в данный класс. Но могу быть не прав
0
RNT
Автор FAQ
3138 / 358 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
16.09.2010, 15:47  [ТС] 5
Цитата Сообщение от Lavroff Посмотреть сообщение
RNT, Есть непосредственно такой метод "Включение"? По-моему сие эквивалентно... То есть композиция - включение объекта другого класса в данный класс. Но могу быть не прав
В книге, в разделе "Включение" довольно толково описывается включение. Там пишется, что это использование объекта другого класса в данном классе в качестве атрибута. То есть так:

C++
1
2
3
4
5
6
7
class A 
{ };
 
class В 
{ 
        A objA; 
};
А про композицию в книге пишется это:
Что такое композиция ?

Может вы поймете, что имеет ввиду автор под термином "композиция"
 Комментарий модератора 
Прикрепляйте картинки к сообщениям.
1
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.09.2010, 16:05 6
RNT, Согласен. Я не прав.
Судя по пространному определению в книге, я могу сделать вывод, что машина состоит из дверей и прочих деталей, а не имеет их как части... Впринципе логично. В таком случае композиция в программировании - это включение, но включение того из чего состоит класс... Вообщем не могу изложить доходчиво. Да и сомнительно что я понял верно.

Википедия. Вроде бы что-то есть...
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2010, 16:12 7
это способ проектирование системы, в котором упор делается не на наследование, а на особый способ взаимодействия неродственных классов
вам будет лучше поискать "декомпозиция", это из области паттернов проектирования
2
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.09.2010, 16:16 8
Тоже ссылочка ничего так

Цитата 1
1.2.1. Декомпозиция

Способ управления сложными системами известен уже очень давно: "Разделяй и властвуй". Разделение программы на мелкие кусочки, каждый из которых может работать независимо, – вот первый шаг в борьбе со сложностью.

В структурном программировании под декомпозицией понималось разделение алгоритмов, где каждый алгоритм выполнял один из этапов общего процесса. Основой этого принципа является проектирование "сверху вниз".

Можно рассматривать проблему декомпозиции и с другой стороны. Попытайтесь разделить некую систему по признаку принадлежности ее элементов различным абстракциям данной проблемной области.

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

Что лучше: алгоритмическая или объектная декомпозиция? Ответ – обе хороши (или не достаточно хороши). Разделяя алгоритмы, мы концентрируем внимание на порядке действий, разделяя по объектам, мы концентрируемся на агентах, являющихся или объектами, или субъектами действий[1].

Объектная декомпозиция имеет много преимуществ перед алгоритмической, и тем более, если она применяется в начале проектирования большой системы


Цитата 2
3. Понятие декомпозиции в задачах программирования
Само по себе применение объектно-ориентированного языка не вынуждает к
написанию ОО-программ, хотя и упрощает их разработку. Чтобы эффективно исполь-
зовать ООП, требуется рассматривать задачи иным способом, нежели это принято в
процедурном программировании.
Известно утверждение, применимое к естественным языкам, что язык, на кото-
ром высказывается идея, направляет мышление (распространенный пример про снег и
какой-нибудь профессиональный лексикон, который формируется "по потребности"
для решения задач в конкретный предметных областях). Как для компьютерных, так и
для естественных языков справедливо: язык направляет мысли, но не предписывает
их.
Аналогично, объектно-ориентированная техника не снабжает программиста
новой вычислительной мощностью, которая бы позволила решить проблемы, недос-
тупные для других средств. Но ОО-подход делает задачу проще и приводит ее к более
естественной форме. Это позволяет обращаться с проблемой таким образом, который
благоприятствует управлению большими программными системами.
ООП часто называется новой парадигмой программирования. Другие парадиг-
мы: процедурное (языки Паскаль, Си), логическое (Пролог), функциональное (Лисп)
программирование. Парадигма программирования – способ концептуализации, кото-
рый определяет, как проводить вычисления и как работа, выполняемая компьютером,
должна быть структурирована и организована.
Процесс разбиения задачи на отдельные, структурно связанные, части, называ-
ется декомпозицией. При процедурной декомпозиции в задаче выделяются алгоритмы
и обрабатываемые ими структуры данных, при логической – правила, связывающие
отдельные понятия. При ОО-декомпозиции в задаче выделяются классы и способы
взаимодействия объектов этих классов друг с другом.
Центральная часть ООП – техника организации вычислений и данных. В про-
граммировании она явилась совершенно новой, но она базируется на давно известном
подходе к классификации, примененном еще Линнеем (XVIII в., выделение родов и
видов для классификации животных и растений).
1
RNT
Автор FAQ
3138 / 358 / 3
Регистрация: 08.08.2009
Сообщений: 1,126
16.09.2010, 18:08  [ТС] 9
Кажется, я понял. Если не прав - поправьте, пожалуйста.
1) Синтаксически включение и композиция выглядят одинаково.
2) Композиция - собирание класса из объектов других классов, специально написанных, чтобы быть атрибутами данного класса.
3) Включение - просто включение в класс объекта подходящего класса.
3
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
16.09.2010, 18:15 10
RNT, У меня приблизительно такое же мнение
0
rabbit-killer
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 2
30.11.2010, 22:32 11
а может кто показать на С++ примере использование композиции? самый простой, где в классе другой класс. Или при композиции в класс должно входить больше одного составляющего класса?
Заранее спасибо.
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
30.11.2010, 23:00 12
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
class B{
public:
  virtual void sound() = 0;
};
 
class A{
public:
  A( B* b ) : m_b(b) {}
  void deleteFile(){ 
    // 
    m_b->sound();
    //
  }
private:
  B* m_b;
};
 
 
class Music : public B{
  void sound(){
    //something play
  }
};
 
int main(){
  A a( new Music() );
}
0
rabbit-killer
0 / 0 / 0
Регистрация: 27.11.2010
Сообщений: 2
01.12.2010, 01:05 13
немного не понял. тогда лучше вы меня попробуйте понять. мне надо при помощи композиции соеденить два класса.
вот в общем код
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
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
class Rect
{
public:
    int x1, y1, x2, y2;
    Rect()
    {
        x1 = x2 = y1 = y2 =0;
    }
    Rect(int x1, int x2, int y1, int y2)
    {
        this->x1 = x1;
        this->x2 = x2;
        this->y1 = y1;
        this->y2 = y2;
    }
};
class Window
{
private:    Rect newWindow;
public:     Window(Rect sample)
            {
                newWindow.x1 = sample.x1;
                newWindow.x2 = sample.x2;
                newWindow.y1 = sample.y1;
                newWindow.y2 = sample.y2;
            }
            void move(int x1, int x2, int y1, int y2)
            {
                newWindow.x1 = newWindow.x1 + x1;
                newWindow.x2 = newWindow.x2 + x2;
                newWindow.y1 = newWindow.y1 + y1;
                newWindow.y2 = newWindow.y2 + y2;
            }
            void countArea()
            {
                int Area;
                Area = abs((newWindow.x1 - newWindow.x2) * (newWindow.y1 - newWindow.y2));
                cout<<"Area is - "<<Area<<endl;
            }
            void printWindow()
            {
                cout<<"Window - "<<newWindow.x1<<" "<<newWindow.x2<<" "<<newWindow.y1<<" "<<newWindow.y2;
                cout<<endl;
            }
};
 
void main()
{
    Window AA(Rect(-1,4,-1,4));
    AA.printWindow();
    AA.move(1,1,1,1);
    AA.printWindow();
    AA.countArea();
    AA.printWindow();
    getch();
}
знаю, нубо код, но все же.
0
Nameless One
01.12.2010, 04:00
  #14

Не по теме:

А еще в программировании и математике есть такое понятие, как композиция функций

0
stawerfar
144 / 58 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 13:26 15
Уважаемые форумчане прочитав Ваши мысли я понял что такое композиция. Это когда в классе создаются ещё классы ну вобщем вот примес сами смотрите....
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
#include <iostream>
 
class A
{
    private:
        class B
        {
            private:
                class C
                {
                    private:        
                        int i_a;
                        int i_b;
                    public:
                        C():i_a(0),i_b(0)
                        {}
                        C(int a,int b):i_a(a),i_b(b)
                        {}
                        void put(int a,int b)
                        {
                            i_a=a;
                            i_b=b;
                        }
                        void get(void)
                        {
                            std::cout<<i_a<<"\n"<<i_b<<std::endl;
                        }
                }C_class;
                double db_f;
                float f_s;
            public:
                B(void):db_f(0.0),f_s(0.0F)
                {}
                B(double da,float fb,int ia,int ib):db_f(da),f_s(fb)
                { C_class.put(ia,ib);}
                void put(double da,float fb,int ia,int ib)
                {
                    db_f=da;
                    f_s=fb;
                    C_class.put(ia,ib);
 
                }
                void get(void)
                {
                    std::cout<<db_f<<"\n"<<f_s<<std::endl;
                    C_class.get();
                }
        }B_class;
        
        enum{MAX=100};
        char ch_mas[MAX];
    public:
        A(void)
        {strcpy(ch_mas,"");}
        A(char* ch_pt,double d,float f,int ia, int ib)
        {
            strncpy(ch_mas,ch_pt,MAX);
            B_class.put(d,f,ia,ib);
        }
        void put(char* ch_pt,double d,float f,int ia, int ib)
        {   
            strncpy(ch_mas,ch_pt,MAX);
            B_class.put(d,f,ia,ib);
        }
        void get(void)
        {
            std::cout<<ch_mas<<"\n";
            B_class.get();
        }
};
 
int main(void)
{
    class A a("composition",1.12,7.22F,3,2);
//  a.B_class.C_class.put(); так нельзя так как класс С является закрытым полем и может исползоваться только\
    методами в нутни класса В
    a.get();
    system("pause");
return 0;
}
А вот ЭТО ВКЛЮЧЕНИЕ
Добавлено через 1 минуту
Цитата Сообщение от alex_x_x Посмотреть сообщение
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
class B{
public:
  virtual void sound() = 0;
};
 
class A{
public:
  A( B* b ) : m_b(b) {}
  void deleteFile(){ 
    // 
    m_b->sound();
    //
  }
private:
  B* m_b;
};
 
 
class Music : public B{
  void sound(){
    //something play
  }
};
 
int main(){
  A a( new Music() );
}
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
17.01.2012, 13:43 16
stawerfar, а я думал это называется вложенный класс
0
stawerfar
144 / 58 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 13:56 17
Я знаю о существовании термина , но именно приведённый мною код отвечает требованиям, объяснениям в книге Лафоре т.е.:
часть может принадлежать только одному целому;
время жизни части то же, что и целого;
даже одиночный объект может относиться к классу как композиция. В машине только один двигатель.

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

Вот как-то так. Что вы скажете по этому поводу?
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
17.01.2012, 14:09 18
stawerfar, не согласен. Теоретически двигатель от автомобиля можно к чему угодно приспособить, например, чтобы он конвейер толкал или банки консервные открывал (ведь всё, что он производит - это вращение).
0
stawerfar
144 / 58 / 8
Регистрация: 14.12.2010
Сообщений: 347
Записей в блоге: 1
17.01.2012, 14:15 19
Я Вам об этом же и говорил но представите себе сам по себе двигатель ни к чему не подсоединённый который при запуске начинает "работать" но ничего полезного при этом не происходит.
Вот что я имел в введу. Для таких целей ни кто ни когда ни будет создавать подобные механизмы. Вы со мною согласны?
И именно по этой причине они не могут сами по себе существовать.
0
silent_1991
Эксперт С++
5009 / 3069 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
17.01.2012, 14:19 20
stawerfar, нет. Пока двигатель не поместили в автомобиль, он на заводе вот именно такой - голый, нерабочий. Короче, двухсоткилограммовый кусок железа. Наш код - завод. Класс "двигатель" - чертежи. А вот экземпляр класса, включённый в другой класс - это уже сам двигатель. Реальный, осязаемый, рабочий.
0
17.01.2012, 14:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2012, 14:19

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

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

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


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

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

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