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

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

01.04.2012, 18:23. Показов 6640. Ответов 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,531
Записей в блоге: 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,531
Записей в блоге: 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,698
01.04.2012, 20:42
Цитата Сообщение от OrmaJever Посмотреть сообщение
Но зачем помещать свойство в приват и затем делать 2 лишних метода для работы с ним?
Ну это старая песня типа: "Учитесь правильно на простом, чтобы не учиться на сложном, что тяжело вдвойне". Кто его знает, может это и так. Как-то внутренне дисциплинирует, что ли. А это на самом деле важно.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 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,531
Записей в блоге: 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,531
Записей в блоге: 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,531
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru