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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Структура и типы  (Прочитано 10953 раз)
slim
Гость
« Ответ #15 : Февраль 04, 2011, 21:02 »

2Igors:
моя мысль выражается в том, что данные нужно инкапсулировать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Февраль 04, 2011, 21:54 »

2Igors:
моя мысль выражается в том, что данные нужно инкапсулировать.
Цель инкапсуляции - скрыть "внутренние делали реализации". Теперь getX/setX вместо "просто x" - ну и что же этим скрывается?  Улыбающийся

Хоть бы один честно сказал "ну списываю"  Улыбающийся
Записан
slim
Гость
« Ответ #17 : Февраль 04, 2011, 22:29 »

если данные используются за приделами класса/структуры я их всегда инкапсулирую
Записан
Waryable
Гость
« Ответ #18 : Февраль 05, 2011, 08:13 »

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

PS: аднака вероятен холивар...  Веселый
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #19 : Февраль 05, 2011, 11:50 »

Зачем использовать в С++ вообще структуры?
Замените их на классы и всё, ИМХО, месить всё  кучу - нехорошо.
Записан

ArchLinux x86_64 / Win10 64 bit
Omg
Гость
« Ответ #20 : Февраль 05, 2011, 12:31 »

Удобочитаемость программы - не? Не катит?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #21 : Февраль 05, 2011, 12:40 »

kuzulis, иногда хорошо. Для обобщения каких-либо данных. Так же если в
классе становится довольно много mutable членов, то лучше их собрать в одну структуру.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Waryable
Гость
« Ответ #22 : Февраль 05, 2011, 12:50 »

Ну как бэ... Ответ тут больше метафизический.
Для меня Структура - это набор данных, а не представление некоторой сущности, в отличие от Класса. Структура не самодостаточна и служит только как свод открытых данных(квалификаторы доступа в описании структуры я никогда не использую). Встречая структуру в коде, который я написал год назад, я знаю, что это просто данные, за которыми не скрыто ничего больше. Т.о. для меня Структура и Класс - две разных концепции.  
Код:
Замените их на классы и всё, ИМХО, месить всё  кучу - нехорошо.
Не спорю с вашим ИМХО, но мое ИМХО говорит, что переделать все структуры в классы как раз и будет месивом в куче.
Записан
Waryable
Гость
« Ответ #23 : Февраль 05, 2011, 12:52 »

kuzulis, иногда хорошо. Для обобщения каких-либо данных. Так же если в
классе становится довольно много mutable членов, то лучше их собрать в одну структуру.
Это не отговорка в данном случае. Оберните в Класс.  Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Февраль 05, 2011, 13:10 »

Насколько я помню, общее определение "класса" в С++ это: class, struct или union. То есть ++ ничего не имеет против struct и они совсем не являются "пережитком С". Вот примерчик (а то разговор слишком общий)

Код
C++ (Qt)
struct CPoint {
..
// data
float x, y, z;
};
 
Теперь мне надо много всяких утилитарных ф-ций, напр.

Код
C++ (Qt)
inline float Dot( const CPoint & a, const CPoint & b )
{
return a.x * b.x + a.y * b.y + a.z * b.z;
}
 
inline CPoint Cross( const CPoint & a, const CPoint & b )
{
return CPoint(a.y * b.z - a.z * b.y, a.x * b.z - a.z * b.x, a.x * b.y - a.y * b.z);
}
 
// и еще десятка два таких
 
Как Вы это сделаете с "аксессорами" - не устанете ли писать?  Улыбающийся  Зачем начинать "бег в мешке" если в нем не было никакой необходимости (можно просто бежать) ?




Записан
Fat-Zer
Гость
« Ответ #25 : Февраль 05, 2011, 13:36 »

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

По поводу примера: сделать функции друзьями или членами (я обычно использую оператор * для скалярного и ^ для векторного - очень удобно получается). да и пару лишних скобок дописать труда не составит...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Февраль 05, 2011, 14:19 »

только union не мешайте в общую кучу, а так единственное различие между классом и структурой - это то, что в структуре все переменные по умолчанию открыты.
Я не "мешаю", а повторяю определение Страутструпа  Улыбающийся Кстати union очень интересный зверь, и жаль что (видимо) стандарт изменен и сейчас "union cannot have non-trivial members" - а при прежнем заведующем этого не было.

По поводу примера: сделать функции друзьями или членами (я обычно использую оператор * для скалярного и ^ для векторного - очень удобно получается). да и пару лишних скобок дописать труда не составит...
Верно, я тоже использую операторы * и | (для векторного). Но это хорошо когда "весь текст мой". А если уже есть какое-то приложение и оно использует свой класс, напр. QVector3D. А нужных ф-ций нет, и что делать? Наследоваться от QVector3D - так это бесконечные приведения. Приходится мириться с геттерами/сеттерами которые никакой нагрузки не несут а только путаются под ногами.

На мой взгляд есть масса структур которые никакой "сущностью" не являются. Часто они могут иметь десятки ф-ций членов (напр та же CPoint) и особенно операторов, но все равно они пассивны, так что нечего городить искусственную инкапсуляцию. Если уж на то пошло то методы
Код
C++ (Qt)
float CPoint::getX( void ) const { return x; }
void CPoint::setX( float _x ) { x = _x; }
 
Противоречат идее инкапсуляции по существу. Нигде не должно возникать необходимости доступа только к "x" (конкретно для класса 3D точка).
Записан
Fat-Zer
Гость
« Ответ #27 : Февраль 05, 2011, 15:03 »

Кстати union очень интересный зверь, и жаль что (видимо) стандарт изменен и сейчас "union cannot have non-trivial members" - а при прежнем заведующем этого не было.
Интересный то интересный, но на практике почти не используется... да и оставлен он ИМХО исключительно в целях совместимости с си.
Код
C++ (Qt)
float CPoint::getX( void ) const { return x; }
void CPoint::setX( float _x ) { x = _x; }
[/quote]
Да... c getX() векторное произведение  выглядело бы особенно страшно)
Нигде не должно возникать необходимости доступа только к "x" (конкретно для класса 3D точка).
печать, обход плоскости.
ЗЫ: я тоже не сторонник пихания в риват всего и вся. Подмигивающий
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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