Russian Qt Forum

Программирование => Общий => Тема начата: blood_shadow от Октябрь 19, 2011, 21:01



Название: Агрегация по указателю или агрегация объекта
Отправлено: blood_shadow от Октябрь 19, 2011, 21:01
Добрый вечер,
не хочу разводить холивары, но мучает постоянно один и тот же вопрос
Допустим есть форма и класс диалога который должен использовать функционал этой формы,

Диалог можно сделать 3 способами: множественным наследованием, агрегацией с помощью указателя
и просто агрегацией объекта
Код
C++ (Qt)
class MyDialog : public QDialog, public Ui::myDialog
{}
 
...
 
class MyDialog : public QDialog
{
Ui::Dialog *ui;
}
 
MyDialog::MyDialog()
: ui(new Ui::myDialog)
 
...
 
class MyDialog : public QDialog
{
Ui::Dialog ui;
}
 
 

Понятно что множественное наследование здесь вариант хуже всего, да и вообще
множественное наследование редко когда сулит что-нибудь хорошее,

а вот вопрос именно про 2 последних варианта, в первом случае наш объект формы будет
жить в куче, а во втором на стеке, хотелось бы услышать мнение экспертов каков вариант
лучше и какие есть +/- двух последних

Спасибо  :)


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: alexman от Октябрь 19, 2011, 21:12
2 и 3 мало чем отличаются, так как в форме все равно указатели хранятся.


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: kambala от Октябрь 19, 2011, 21:30
тоже всегда интересовал этот вопрос применимо к UI в Qt - нигде не написано что и когда лучше использовать, а спросить как-то стеснялся :)

минус агрегации через указатель - надо писать delete в деструкторе и new в конструкторе (лишние символы) :) потому всегда пользуюсь "просто" агрегацией.


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: blood_shadow от Октябрь 19, 2011, 21:32
тоже всегда интересовал этот вопрос применимо к UI в Qt - нигде не написано что и когда лучше использовать, а спросить как-то стеснялся :)
та тут все свои нечего стеснятся  ;)
Цитировать
минус агрегации через указатель - надо писать delete в деструкторе и new в конструкторе (лишние символы) :) потому всегда пользуюсь "просто" агрегацией.
я тож так делаю


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: Akon от Октябрь 19, 2011, 21:38
В общем случае вариан с указателем более гибкий:
- позволительно forward declaration (т.е. меньше зависимостей времени компиляции);
- есть возможность хранить агрегаты полиморфных типов (паттерн стратегия);
- полный контроль над временем жизни агрегата (создание и удаление в любое время); в частности, очень распространена lazy initialization;
- в случаях, где это имеет смысл, можно использовать shared-агрегаты.

Вариант с объектом-членом более прост, и если перечисленные выше достоинства по боку, следует использовать именно его.

Вариант с множественным наследованием, но только с закрытым (наследование реализации), близок варианту с объектом-членом, но имеет "потенциальные проблемы множественного наследования". Если таких проблем не предвидится, возможно, следует использовать его по причине меньшего синтаксиса (в ущерб читаемости).

В литературе под тем, что вы обозначили агрегацией, используется термин композиция (composition - закрашенный ромб в UML). Агрегация - это когда агрегируемые объекты не уничтожаются владельцем. В русском переводе GoF агрегация именуется "отношением осведомленности".


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: Igors от Октябрь 20, 2011, 08:40
В данном случае "без разницы", экономия на написании неск строк несущественна. В любом случае "Ui" всецело принадлежит диалогу. Не видно реальных вариантов когда член Ui может передаваться "из рук в руки", совместно использоваться, быть полиморфным и.т.п. (здесь хорош указатель). Множ наследование, на мой взгляд, ничем здесь не плохо, пожалуй даже "самое идейное". Но раскрыть здесь свои сильные стороны - тоже не видно где.

Ну и как вариант - обойтись вообще без "ритуального" класса Ui  :)


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: blood_shadow от Октябрь 20, 2011, 10:35
Ну и как вариант - обойтись вообще без "ритуального" класса Ui  :)
насчет этого не понял это как? прописывать форму вручную?


Название: Re: Агрегация по указателю или агрегация объекта
Отправлено: Igors от Октябрь 20, 2011, 17:50
насчет этого не понял это как? прописывать форму вручную?
Лучше грузить из ресурса