Russian Qt Forum
Ноябрь 22, 2024, 16:50
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
c++ 11/14 vs "старый c++"
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: c++ 11/14 vs "старый c++" (Прочитано 15269 раз)
AzazelloAV
Гость
Re: c++ 11/14 vs "старый c++"
«
Ответ #15 :
Июнь 22, 2017, 15:27 »
Цитата: ssoft от Июнь 22, 2017, 14:13
Это понятия ООП. Между объектами могут существовать отношения.
Одним из видов отношений являются ассоциации. Ассоциация означает, что экземпляры одного класса связаны с экземплярами другого класса.
Экземпляр ассоциации (связь) состоит из полюсов, связанных с объектами.
Часто ассоциативная связь реализуется в виде, когда её полюсы принадлежат одному и более объектам, участвующим в ассоциативной связи.
Частным случаем ассоциаций являются биполярные ассоциации.
Частным случаем биполярной ассоциации является ассоциация агрегации (отношение Часть/Целое). Целое определяет время жизни Части.
Со стороны Целого полюс ассоциативной может быть либо unique (уникальная или композитная агрегация), либо shared (обобщенная агрегация).
Со стороны Части может либо не быть полюса, либо быть none (полюс не агрегации).
Хотя в стандарт и ввели unique_ptr и shared_ptr, но кроме названий ничего общего полюсами уникальной (композитной) и обобщенной агрегации они не имеют.
При этом они могут быть использованы при реализации этих самых полюсов ассоциативных связей (наравне с raw указателем)) ).
Это какой то адский треш. Я всегда думал, что патерны придумали, чтобы разрабочикам было легче общатся. Не "делаю то-то, то-то, то-то, то-то", а использую петерн "название". Но со временем ситуация изменилась. Не патерны для прогеров, а прогеры для патернов. Теперь мне их хоть раз в пол года повторяй. И что самое инетересно - у всех они уже на подсознательном уровне. Проще это сделать, чем заучить вышенаписанное.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: c++ 11/14 vs "старый c++"
«
Ответ #16 :
Июнь 22, 2017, 15:32 »
Цитата: AzazelloAV от Июнь 22, 2017, 15:27
Это какой то адский треш. Я всегда думал, что патерны придумали, чтобы разрабочикам было легче общатся. Не "делаю то-то, то-то, то-то, то-то", а использую петерн "название". Но со временем ситуация изменилась. Не патерны для прогеров, а прогеры для патернов. Теперь мне их хоть раз в пол года повторяй. И что самое инетересно - у всех они уже на подсознательном уровне. Проще это сделать, чем заучить вышенаписанное.
Ну это просто термины дурацкие и незапоминающиеся (я до сих пор не могу запомнить кто сильнее - композиция или агрегация). То ли дело в uml - закрашенный ромбик (композиция) сильнее незакрашенного (агрегация)
Записан
AzazelloAV
Гость
Re: c++ 11/14 vs "старый c++"
«
Ответ #17 :
Июнь 22, 2017, 15:49 »
Цитата: Авварон от Июнь 22, 2017, 12:02
Почему нет? (Абстрагируемся о том, что исключения вообще с Qt кодом не дружат (я уже давно не пишу на Qt, к сожалению)). Это единственный способ сообщить об ошибке в конструкторе. Альтернативой будет только богомерзкий метод bool init(); который можно внезапно забыть вызвать. Или вызвать дважды. В общем, вы поняли, придётся писать много документации о том, как использовать ваш класс. Вместо банального инстанцирования.
Тут с Вами готов поспорить. Вы же согласны, что конструктор нужно осторожно писАть, когда в нем может быть исключение. Вообщем это заманчиво на самом деле, но я (и Вы), как старпёры (в плохом смысле старпёры) поняли - чем проще - тем лучше. В любом объекте, в котором конструктор может вызвать исключение есть критичные данные, без которых он не сможет функционировать - ошибки не будет, но и результата тоже. Вместо метода init спокойно можно использовать метод наподобие setData(...), чем грешат очееень многие. К тому же плюс такого подхода - вызвов виртуального метода.
«
Последнее редактирование: Июнь 22, 2017, 15:51 от AzazelloAV
»
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: c++ 11/14 vs "старый c++"
«
Ответ #18 :
Июнь 22, 2017, 15:56 »
Цитата: Авварон от Июнь 22, 2017, 14:22
Цитата: ssoft от Июнь 22, 2017, 14:13
Частным случаем биполярной ассоциации является ассоциация агрегации (отношение Часть/Целое). Целое определяет время жизни Части.
Кажется, тут вы врёте. Из вики:
Цитировать
Агрегация (агрегирование по ссылке) — отношение «часть-целое» между двумя равноправными объектами, когда один объект (контейнер) имеет ссылку на другой объект. Оба объекта могут существовать независимо: если контейнер будет уничтожен, то его содержимое — нет.
Цитировать
Композиция (агрегирование по значению) — более строгий вариант агрегирования, когда включаемый объект может существовать только как часть контейнера. Если контейнер будет уничтожен, то и включённый объект тоже будет уничтожен.
Цитировать
Aggregation differs from ordinary composition in that it does not imply ownership. In composition, when the owning object is destroyed, so are the contained objects. In aggregation, this is not necessarily true
В чем расхождение?
Если часть является композитом целого, то удаление целого означает удаление части. Если агрегатом, то часть не удаляется (хотя часть бывает целесообразно удалять часть при удалении всех связанных экземпляров целого).
И в википедии не вполне корректные определения, лучше пользоваться определениями спецификации UML
http://www.omg.org/spec/UML/
,
http://www.uml-diagrams.org/association.html
Вместо терминов агрегация, композиция, как видов ассоциаций, к концам ассоциаций целесообразнее применять понятия уникальная агрегация (unique), совместная агрегация (shared), не агрегация (none).
Сам экземпляр ассоциативной связи Link является совокупностью всех концов. Один конец не определяет ассоциативную связь.
Нет никакого обязательного соответствия, что агрегация это только ссылка, указатель или что-то еще; или что композиция это только inplace значение (расположенное непосредственно в экземпляре целого), и не может быть реализовано посредством raw, unique_ptr, shared_ptr, reference_wrapper или любого другого указателя, контейнера или ссылки.
Записан
panAlexey
Гипер активный житель
Offline
Сообщений: 864
Акцио ЗАРПЛАТА!!!!! :(
Re: c++ 11/14 vs "старый c++"
«
Ответ #19 :
Июнь 24, 2017, 09:18 »
ИМХО 2-й пример добавляет работы процессору и его надо использовать там, где это действительно необходимо.
Такая избыточность должна быть использована с умом.
Записан
Win Xp SP-2, Qt4.3.4/MinGW.
http://trdm.1gb.ru/
_Bers
Бывалый
Offline
Сообщений: 486
Re: c++ 11/14 vs "старый c++"
«
Ответ #20 :
Июнь 24, 2017, 21:14 »
Цитата: panAlexey от Июнь 24, 2017, 09:18
ИМХО 2-й пример добавляет работы процессору и его надо использовать там, где это действительно необходимо.
Такая избыточность должна быть использована с умом.
вы это о чем вапще?
Записан
ssoft
Программист
Offline
Сообщений: 584
Re: c++ 11/14 vs "старый c++"
«
Ответ #21 :
Июнь 26, 2017, 08:11 »
Цитата: panAlexey от Июнь 24, 2017, 09:18
ИМХО 2-й пример добавляет работы процессору и его надо использовать там, где это действительно необходимо.
Такая избыточность должна быть использована с умом.
ИМХО) это заблуждение. Что raw указатель, что unique_ptr работают одинаково быстро. Вся "избыточность" исчезает на этапе компиляции.
Записан
Авварон
Джедай : наставник для всех
Offline
Сообщений: 3260
Re: c++ 11/14 vs "старый c++"
«
Ответ #22 :
Июнь 26, 2017, 09:50 »
Цитата: ssoft от Июнь 26, 2017, 08:11
ИМХО) это заблуждение. Что raw указатель, что unique_ptr работают одинаково быстро. Вся "избыточность" исчезает на этапе компиляции.
Нет, там чуть больше инструкций. Кто-то из кутешников выкладывал куда-то (возможно, в рассылку) дизассемблированный код.
Из-за обработки исключений, нужно корректно сворачивать стек.
Но я на самом деле разочарую - это экономия на спичках; аналогичный код вставляется при использовании любого не-POD типа (ну представьте, есть 2 строки в классе, первая сконструирвалась, а вторая тровнула. Первую надо удалить. И так на каждый мембер)
Записан
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...