Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/30: Рейтинг темы: голосов - 30, средняя оценка - 4.60
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241

Свойства класов - зачем помещать свойство в приват

01.04.2012, 18:23. Показов 6926. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Очень часто встречал такие классы
C++
1
2
3
4
5
6
7
8
claas A
{
 public:
  int getCount( void ) { return count; };
  void setCount( int c ) { count = c; };
 privte:
  int count;
}
Но зачем помещать свойство в приват и затем делать 2 лишних метода для работы с ним? Почему бы не поместить это свойство в паблик и не работать с ним на прямую? Просто если так делают значит есть этому логическое обьяснение, и хочется его понять.

PS. тут ещё мысля возникла, если в Си (не C++, а простой Си) небыло оператора new то получается небыло утечек памяти?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.04.2012, 18:23
Ответы с готовыми решениями:

Зачем свойство !hover в QSS
Доброго времени суток, зачем свойство !hover в стилях, если можно обойтись простым QPushButton{}? Или он чем то отличается?

Зачем нужно свойство @property (assign)
Для чего нужно свойство property (assign)? Как мне обратиться к полю класса, если оно под @property? Что будет, если убрать его? Я так...

Свойство column свойства margin
Есть свойства: p { column-count: 4; /*Количество колонок в многоколоночном тексте*/ column-fill: balance; /*Определяет как...

54
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.04.2012, 18:26
Геттер (программирование)
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
01.04.2012, 18:31  [ТС]
Спасибо прочитал, но так и не понял в чём преймущество? Ну если не брать тот факт что в метода можно делать всевозможные проверки. Предположим что класс написал я сам и использовать его буду тоже я, что мне даёт такой метод?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
01.04.2012, 19:41
Цитата Сообщение от OrmaJever Посмотреть сообщение
Спасибо прочитал, но так и не понял в чём преймущество? Ну если не брать тот факт что в метода можно делать всевозможные проверки. Предположим что класс написал я сам и использовать его буду тоже я, что мне даёт такой метод?
Да я тоже задавал тут этот вопрос. По идее да, нет смысла. Но некоторые "неговнокодеры" считают это дурным тоном.

Вот помню, то ли у Страуструпа, то ли ещё в какой классике был пример класс "сумма чисел" и он выглядел так
C++
1
2
3
4
5
6
7
8
9
10
11
class sum{
private:
int a, b, c;
public:
sum(int m, int n){a=m, b=n; c=m+n;}
void seta(int m){a=m; c=a+b;}
void setb(int m){b=n; c=a+b;}
int geta(){return a;}
int getb(){return b;}
int getc(){return c;}
};
То есть сокрытие в этом примере необходимо, чтобы цэ всегда оставался равен a+b
Ещё скрывают поля класса-указатели, в которых выделена динамическая память,
чтобы она выделялась/удалялась по правилам (например только в конструкторе, деструкторе и при копировании) и никто другой не мог бы создать утечку. Это тоже хорошее дело! Например
C++
1
2
3
4
5
6
7
8
9
10
11
class array{
private:
int* data;
int size;
public:
array(int);
~array();
array(array&);
int& operator[] (int);
array& operator = (array&);
};
Действительно, чтобы не потекла память надо ограничивать к ней доступ в таком классе!

Но это не означает, что надо брать идиотскую моду постоянно скрывать всё что нужно и не нужно. Вообще всё! Например класс Vector3D я бы спокойно совершенно объявил так:
C++
1
2
3
4
5
class Vector3D{
public:
double x, y, z;
///...и.т.д. все конструкторы, операторы, методы всё публично
};
И не вижу ни единой причины скрывать данные.

Добавлено через 28 минут
А вообще часто скрывают поля класса, чтобы следовать концепции "сокрытия реализации". То есть для пользователя класса оставляют открытыми для использования лишь несколько "рычагов воздействия" - методов класса. При этом подразумевается, что создав класс, программист может передать его своим коллегам, или "себе самому" так, что продолжая работу с этим классом можно забыть все сложности структур и алгоритмов скрытых внутри, абстрагироваться от них.
Таким образом создавать всё более сложные программы, оперируя простыми понятиями: Например создал класс render3D и его пользователей совершенно не беспокоит DirectX так выводит 3D картинку или OpenGL. Они воздействуют на класс методами "нарисуй то" да "нарисуй сё". При этом изменения внутренних полей класса нам не важно, а мы сосредотачиваемся на более нужных вещах.
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.04.2012, 19:59
Цитата Сообщение от OrmaJever Посмотреть сообщение
PS. тут ещё мысля возникла, если в Си (не C++, а простой Си) небыло оператора new то получается небыло утечек памяти?
Зато там были функции malloc/calloc/realloc, поэтому и утечки памяти там тоже имели место))

Добавлено через 3 минуты
Kuzia domovenok, опять вы за своё? Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
01.04.2012, 20:21
Цитата Сообщение от silent_1991 Посмотреть сообщение
Зато там были функции malloc/calloc/realloc, поэтому и утечки памяти там тоже имели место))

Добавлено через 3 минуты
Kuzia domovenok, опять вы за своё? Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
Ой, ты надеюсь не начинающий? Нет? Ой, отлично, есть кому вопрос задать, не заморочив голову. Скажи пожалуйста, зачем в моём примере ( class Vector3D{public: int x, y, z;}; ) Зачем в нём может потребоваться скрывать поля класса. Ну хоть одна причина?

И второе, раз уж у меня голова "не тем забита", покажи мне хоть одного автора книг по Си++, который бы советовал "Скрывать все поля класса, вне зависимости от задачи". А то я конечно искренне хочу улучшить своё знание си++, но как-то авторам публикаций больше верю, чем тебе
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.04.2012, 20:37
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Зачем в нём может потребоваться скрывать поля класса. Ну хоть одна причина?
в вашем примере нет смысла его делать классом, так как ему нечего инкапсулировать кроме своих данных
1
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
01.04.2012, 20:39
Kuzia domovenok, ищите моё предыдущее сообщение, когда вы в прошлый раз подняли этот вопрос.
Относительно вашего класса - причина банальна. Если мы захотим хранить вектор в виде массива (например, std::array), чтобы, например, была возможно вернуть сразу все три координаты, то весь код, написанный с использованием предыдущей версии вектора, полетит к чертям.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
авторам публикаций больше верю, чем тебе
То же могу сказать в отношение вас.
1
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
01.04.2012, 20:42
Цитата Сообщение от OrmaJever Посмотреть сообщение
Но зачем помещать свойство в приват и затем делать 2 лишних метода для работы с ним?
Ну это старая песня типа: "Учитесь правильно на простом, чтобы не учиться на сложном, что тяжело вдвойне". Кто его знает, может это и так. Как-то внутренне дисциплинирует, что ли. А это на самом деле важно.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
01.04.2012, 20:51
Цитата Сообщение от alex_x_x Посмотреть сообщение
в вашем примере нет смысла его делать классом, так как ему нечего инкапсулировать кроме своих данных
Почему нет? Я хочу сделать класс трёхмерного вектора, который хранил бы только три компоненты вектора без какого-либо динамического выделения памяти. Зачем мне их скрывать в private?

Далее, я хочу добавить в класс методы получения модуля этого вектора, операторы скалярного и векторного умножения, векторного сложения и ещё 100500 операций над векторами зачем мне делать его структурой?
Да, знаю в С++ структуры могут содержать методы, но в таком виде они мало отличаются от классов.
Ну и наконец, я этот пример с вектором не от балды взял, а реально существует куча примеров исходников, в которых авторы не прячут параноидально все поля в public, просто потому что "так модно".

Цитата Сообщение от kravam Посмотреть сообщение
Ну это старая песня типа: "Учитесь правильно на простом, чтобы не учиться на сложном, что тяжело вдвойне". Кто его знает, может это и так. Как-то внутренне дисциплинирует, что ли. А это на самом деле важно.
Чтобы учить, нужно не только показывать "как надо", но ещё и объяснять, почему "так надо". Пока что я во всей теме не нашёл ни одного объяснения. всё сводится к "это хороший тон программирования", "так надо, потому что так надо". И никто не привёл ни одного примера, когда публичное поле класса вызвало жуткие страдания у программиста.
(Разумеется имеется в виду не динам.память, о которой я уж сто раз оговорился в теме, а обычное поле, которое бы вызвало тонну ужаса из-за публичности) Ну же! Примеры где?
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.04.2012, 20:58
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Почему нет? Я хочу сделать класс трёхмерного вектора, который хранил бы только три компоненты вектора без какого-либо динамического выделения памяти. Зачем мне их скрывать в private?
я написал по тому, что написано, а не в чьих-то фантазиях

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в которых авторы не прячут параноидально все поля в public, просто потому что "так модно".
например?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
01.04.2012, 21:06
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
в которых авторы не прячут параноидально все поля
тогда они пишут struct
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
01.04.2012, 21:08
Цитата Сообщение от alex_x_x Посмотреть сообщение
например?
Вот держи. http://steps3d.narod.ru/
Автор, кстати большой сторонник ООП, и всячески использует и наследование и полиморфизм и reference counting в программах делает и.т.д.
Но делает это с умом и у него нет параноидального желания писать для каждого поля класса сеттер и геттер. Если поле скрыто - на то есть причина.
Вот тот самый его вектор, пример которого я привёл
http://sigelengine.googlecode.... vector3d.h
Ещё вопросы? Может кто-нибудь возразит аргументированно, чего не хватает в этом конкретном коде, а не станет продолжать "так надо, потому что это хороший тон"
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.04.2012, 21:15
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
http://sigelengine.googlecode.com/sv...ath/vector3d.h
Ещё вопросы? Может кто-нибудь возразит аргументированно, чего не хватает в этом конкретном коде, а не станет продолжать "так надо, потому что это хороший тон"
это элементарный код и эти x, y, z относятся к внешнему интерфейсу вектора
никакого контроля значений не присутствует
в продакшене геттерами и сеттерами покрывают чуть более сложные вещи

для критического быстродействия это правильный ход, но с точки зрения расширяемости скорее всего нет
захоти он добавить какойнить thread-safety и его интерфейс развалится
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
01.04.2012, 21:34
Цитата Сообщение от alex_x_x Посмотреть сообщение
это элементарный код и эти x, y, z относятся к внешнему интерфейсу вектора
Ну а кто-то тут говорил о сложных вещах? Товарищ ТС просил объяснить необходимость в геттерах/сеттерах. Вот я и говорю, что в простых программах нужды нет применять их ПОВСЕМЕСТНО. когда надо контролировать динамическую память, целостность данных, строить всякие синглтоны, reference counterы и прочее - пожалуйста! используйте private!
Но скрывать то, что кто угодно может изменить геттером и сеттером - очевидная глупость!
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
01.04.2012, 21:47
как минимум ТСа это лишит возможности контролировать валидность устанавливаемых значений
(почему бы не сделать A().count = -1; )
с практической же точки зрения так проще отлаживать (при установке значения не через сеттеры отлавливать изменения можно лишь на уровне watchpoint'ов)
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 22:02
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Вот тот самый его вектор, пример которого я привёл
Как минимум несколько поводов задуматся о том хороший ли это пример:
- использование макросов, вместо констант
- конструктор копирования не делает ничего, чего бы не сделал генеренный компилятором, не нужен
- часть операторов является членами, часть нет, при ни одному из операторов не нужен доступ к закрытой части, причем все свободные операторы зачем-то объявлены друзьями
- операторы сравнения возвращают int
- почему часть методов делают inplace модификацию объекта (negative), а часть возвращают измененную копию (cross)
4
01.04.2012, 22:12

Не по теме:

Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Как минимум несколько поводов задуматся о том хороший ли это пример:
зато он верит авторам таких "публикаций"

2
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,535
Записей в блоге: 1
01.04.2012, 22:26
Цитата Сообщение от retmas Посмотреть сообщение
зато он верит авторам таких "публикаций"
Страуструпу ты тоже не веришь?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 22:44
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Страуструпу ты тоже не веришь?
Не нужно говоря про ООП, опираться на книги описывающие конкретный язык. В Страуструпе полно не очень хороших примеров кода с точки зрения ООП, служащих при этом неплохой иллюстрацией возможностей языка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.04.2012, 22:44
Помогаю со студенческими работами здесь

Зачем всегда инкапсулировать переменные в свойства
Давно хотел спросить. Вопрос возникает постоянно, когда я вижу код типа такого: class cls { private int _iii; ...

Зачем нужны автоматически реализуемые свойства?
Зачем нужны автоматически реализуемые свойства в c#? Что, нельзя просто пометить поле как public? Зачем надо, чтобы доступ получался только...

Зачем нужны автоматические свойства? {get; set}
Я прочел все темы в этом форуме касательно свойств. Но никто толком не может ответить зачем нужны автоматические свойства, почему они...

Зачем использовать поля, если есть свойства?
Приветствую. Объясните новичку: для чего нужно использовать поля, если есть такая штука, как свойства? Попробую добавить конкретики. ...

Как назначить свойства блоку div через свойство SetAttribute?
Здравствуйте, уважаемые форумчане! Обращаюсь сюда, потому что возникла проблема: не получается добавить свойства к div элементу. Подскажите...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru