Russian Qt Forum
Ноябрь 23, 2024, 07:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Агрегация по указателю или агрегация объекта  (Прочитано 6842 раз)
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 последних варианта, в первом случае наш объект формы будет
жить в куче, а во втором на стеке, хотелось бы услышать мнение экспертов каков вариант
лучше и какие есть +/- двух последних

Спасибо  Улыбающийся
Записан
alexman
Гость
« Ответ #1 : Октябрь 19, 2011, 21:12 »

2 и 3 мало чем отличаются, так как в форме все равно указатели хранятся.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Октябрь 19, 2011, 21:30 »

тоже всегда интересовал этот вопрос применимо к UI в Qt - нигде не написано что и когда лучше использовать, а спросить как-то стеснялся Улыбающийся

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
blood_shadow
Гость
« Ответ #3 : Октябрь 19, 2011, 21:32 »

тоже всегда интересовал этот вопрос применимо к UI в Qt - нигде не написано что и когда лучше использовать, а спросить как-то стеснялся Улыбающийся
та тут все свои нечего стеснятся  Подмигивающий
Цитировать
минус агрегации через указатель - надо писать delete в деструкторе и new в конструкторе (лишние символы) Улыбающийся потому всегда пользуюсь "просто" агрегацией.
я тож так делаю
Записан
Akon
Гость
« Ответ #4 : Октябрь 19, 2011, 21:38 »

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

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

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

В литературе под тем, что вы обозначили агрегацией, используется термин композиция (composition - закрашенный ромб в UML). Агрегация - это когда агрегируемые объекты не уничтожаются владельцем. В русском переводе GoF агрегация именуется "отношением осведомленности".
« Последнее редактирование: Октябрь 19, 2011, 21:45 от Akon » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 20, 2011, 08:40 »

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

Ну и как вариант - обойтись вообще без "ритуального" класса Ui  Улыбающийся
Записан
blood_shadow
Гость
« Ответ #6 : Октябрь 20, 2011, 10:35 »

Ну и как вариант - обойтись вообще без "ритуального" класса Ui  Улыбающийся
насчет этого не понял это как? прописывать форму вручную?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 20, 2011, 17:50 »

насчет этого не понял это как? прописывать форму вручную?
Лучше грузить из ресурса
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.174 секунд. Запросов: 22.