Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.96
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

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

01.04.2012, 18:23. Просмотров 3122. Ответов 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 то получается небыло утечек памяти?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2012, 18:23     Свойства класов - зачем помещать свойство в приват
Посмотрите здесь:

Получить доступ в приват - C++
Не получается получить доступ к полям привата. Вот написал такой код на с++. #include <iostream> using namespace std; class...

Производные классы паблик и приват - C++
Здравствуйте, нужна помощь. Это пример из книги Лафоре ООП С++. Не могу понять почему программа работает, хотя при наследовании классы...

наследование класов - C++
Напишите пожалуйста ету програму, а то я никак немогу разобратся с наследованием. Создать класс колесо, имеющее радиус. Определить...

Наследование класов - C++
Классы для меня в целом очень сложно даются, мне очень нужна данная прога так как все последующие лабораторные будут с ней связаны,...

Проверка наследования класов - C++
У меня есть один базовой клас "Creature", от него наследуються два класа "Animal" и "Plant". От класа "Animal" наследуються еще 2 класа...

Перегрузка операторов разных класов - C++
здравствуйте уважаемые форумчане начал программировать класс полиномов и начал я перегружать оператор * для разных классов friend...

Преобразование типов и методы класов - C++
Есть задача: 1)Создать класс Triangle, разработав следующие элементы класса: поля: int a, b, c; 2)Конструктор, позволяющий создать...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
01.04.2012, 22:47     Свойства класов - зачем помещать свойство в приват #21
Страуструпу я "доверяю, но проверяю". а вот тебе и твоему автору публикации - даже не доверяю.
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
01.04.2012, 23:17  [ТС]     Свойства класов - зачем помещать свойство в приват #22
Цитата Сообщение от silent_1991 Посмотреть сообщение
Начинающим-то хоть голову не забивайте, пусть учатся делать правильно, не всё же время они хеллоуворлды писать будут, в которых нет таких понятий как "расширяемость", "изменение условий задачи" и т.д.
Я не совсем нович, да я не совсем знаю весь синтаксис Си, но я могу построить у себя в голове модель программы и структуру класов, поэтому ответ "так правельно" меня не устраивает, а вот коментарий Домовёнка про указатели очень даже убедил. Спасибо.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 23:24     Свойства класов - зачем помещать свойство в приват #23
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;
}
Так я могу бросить исключение в случае, когда c невалидный, написать thread-safe вариант класса, посчитать количество обращений к c, промониторить изменения ... и все это всего из одного места в кода.
C++
1
2
3
4
5
claas A
{
 public:
  int count;
}
В этом случае чтоб сделать все это мне придется переписать половину всего кода.
Вопрос в поддержке и расширяемости.
silent_1991
01.04.2012, 23:27
  #24

Не по теме:

Цитата Сообщение от villu Посмотреть сообщение
Вопрос в поддержке и расширяемости.
Я уже говорил это Kuzia domovenokу в другой теме... Мой комментарий он проигнорировал.

retmas
01.04.2012, 23:30
  #25

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Мой комментарий он проигнорировал.
зачастую таким людям и не нужны комментарии. им главное сказать своё мнение громко и несмотря ни на что.

CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:35     Свойства класов - зачем помещать свойство в приват #26
Цитата Сообщение от villu Посмотреть сообщение
Так я могу бросить исключение в случае, когда c невалидный, написать thread-safe вариант класса, посчитать количество обращений к c, промониторить изменения ... и все это всего из одного места в кода.
В представленном варианте Сount должен быть обычной структурой, т.к. очевидно, что он представляет данные, а не поведение. Не стоит пихать ООП везде, где только можно и доводы о расшираемости ситуацию не изменят.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
01.04.2012, 23:37     Свойства класов - зачем помещать свойство в приват #27
Цитата Сообщение от silent_1991 Посмотреть сообщение
Не по теме:
Сообщение от villu
Вопрос в поддержке и расширяемости.
Я уже говорил это Kuzia domovenokу в другой теме... Мой комментарий он проигнорировал.
Ок, не буду игнорировать. Как часто ты переопределяешь геттеры сеттеры, которые изначально выглядели так
C++
1
void setter(int v): value(v){}
чем то большим? Какую цену за это платишь?
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:39     Свойства класов - зачем помещать свойство в приват #28
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
C++
1
void setter(int v): value(v){}
Что-то кажется мне невалидным код этот.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
01.04.2012, 23:43     Свойства класов - зачем помещать свойство в приват #29
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Что-то кажется мне невалидным код этот.
В каком месте. Я конечно признаю, что могу ошибаться, но ошибки не вижу.
CyBOSSeR
Эксперт C++
2299 / 1669 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.04.2012, 23:47     Свойства класов - зачем помещать свойство в приват #30
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В каком месте.
В наличии списка инициализации в методе.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 23:52     Свойства класов - зачем помещать свойство в приват #31
а везде и не надо совать.
В той же std есть pair, который структура

а вот такой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class A {
    int count;
public:
#ifdef _DEBUG
    void set(int new_val, char *file = get__FILE__(), int line=get__LINE__() ) {
        g_log_device() << "Change 'с' to  " << new_val << " " << file << ":" << line << "\n";
        if( new_val > MAX_VALUE ) throw std::runtime_error("Invalid value");
        count = new_val;
    }
#else
    void set(int new_val) {
        count = new_val;
    }
#endif
    int get() { return count;}
};
мне однажды очень много времени сэкономил и даже помог отловить бажину в железке. а класс, на сколько помню, у меня тогда просто данные с кардио-датчика содержал, то есть фактически несколько полей (как тот самый вектор x y z), которые можно было сделать структурой.
Тут же TC спрашивал о вариантах, где это полезно может быть, нет разве?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.04.2012, 23:55     Свойства класов - зачем помещать свойство в приват #32
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Kuzia domovenok, ну, если не учитывать, что мои геттеры/сеттеры так не выглядят, потому что список инициализации можно использовать только в конструкторе, то довольно редко. Потому что у меня классы обычно представляют поведение, а не данные, как и должно быть. Сами классы могут пользоваться несколько более высокоуровневыми данными, чем сырые данные стандартных типов, но такие данные я оборачиваю в структуры, описанные внутри классов, в приватной области. Если класс состоит из одних данных и методов доступа, т.е. представляет данные, то надо пересмотреть надобность использования класса.
Asya
Сообщений: n/a
02.04.2012, 00:25     Свойства класов - зачем помещать свойство в приват #33
Скрытие определённых полей класса(инкапсуляция) - базовый принцип объектно-ориентированного программирования.
для справки:
Инкапсуляция (пакетирование) представляет собой механизм, связывающий вместе данные и код, обрабатывающий эти данные, и сохраняющий их от внешнего воздействия и ошибочного использования. Инкапсуляция позволяет создавать объект, являющийся логическим целым, включающим данные и код для работы с этими данными. Объект обеспечивает защиту против случайной или несанкционированной модификации частных (private) составляющих его членов. Закрытые данные или коды (методы) доступны только для других частей этого объекта и недоступны вне его. Открытая часть объекта предназначена для обеспечения контролируемого интерфейса его закрытой части.

проще говоря, это нужно для обеспечения защиты данных, которые не должны быть доступны пользователю на прямую. Например, телевизор: мы нажимаем только на определённые кнопки, которые выполняют те или иные функции. Мы же не имеем доступа ко внутренним компонентам телевизора, которые принимают участие в реализации команды. Ибо если мы будем иметь прямой доступ к важным частям телевизора, мы можем что-нибудь изменить и телевизор не будет работать. Так и с программой. Пользователя не должна волновать реализация. Главное, чтобы выполнялись его команды. А программист всегда получит доступ к защищённым данным, если ему нужно исправить неисправность или добавить какую-нибудь функцию. Вот как-то так
kravam
02.04.2012, 01:28
  #34

Не по теме:

Цитата Сообщение от Asya Посмотреть сообщение
мы можем что-нибудь изменить и телевизор не будет работать
умиляет... А то геттерами ты не можешь ничё ошибочно изменить...

silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.04.2012, 01:29     Свойства класов - зачем помещать свойство в приват #35
kravam, нет, если принять, что геттер написан верно и не пропустит неправильные данные. Отладка классов - отдельная история, мы говорим о законченном рабочем коде.
Buckstabue
175 / 124 / 6
Регистрация: 12.01.2012
Сообщений: 624
02.04.2012, 02:50     Свойства класов - зачем помещать свойство в приват #36
ИМХО, сокрытие в первую очередь нужно, чтобы упростить отладку программы. Например, при моделировании органайзера, мы должны быть твёрдо уверены, что встреча, намеченная в декабре, может проходить только в числах от 1 до 31. В то же время инкапсуляция позволяет делать программы более масштабируемыми. Например, если мы грамотно напишем обобщенный интерфейс доступа к базе данных, то в случае изменения самого сервера( или библиотеки ) БД нам придётся изменить код только в интерфейсе
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
02.04.2012, 02:54     Свойства класов - зачем помещать свойство в приват #37
Цитата Сообщение от Buckstabue Посмотреть сообщение
В то же время инкапсуляция позволяет делать программы более масштабируемыми
Именно для этого она и существует. Например, в одной версии вектора размер может храниться отдельным полем, указатель на начало вектора - отдельным, а в другой могут храниться указатели на начало и конец вектора, а размер вычисляться как разность начала и конца (т.е. размер не хранится явным образом). Тогда реализации методов size будут различными, но если бы не инкапсуляция и методы доступа, то весь код типа "vec.size" лутул бы к чертям, потому что в новой версии класса вообще нету поля "size". Зато обращайся мы сразу через метод доступа, нам не важно, что в новой версии поменяли внутреннюю реализацию, ведь интерфейс, через который мы общались с вектором раньше, остался прежним.
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,420
02.04.2012, 03:07     Свойства класов - зачем помещать свойство в приват #38
Цитата Сообщение от silent_1991 Посмотреть сообщение
kravam, нет, если принять, что геттер написан верно и не пропустит неправильные данные. Отладка классов - отдельная история, мы говорим о законченном рабочем коде.
не пойдёт. Ты вызовешь самый правильный суперпупергеттер в ненужном месте и весь код насмарку. Это я и называю (и оно по-моему такое и по сути)- ошибочно изменить поле класса.

И сразу же вопрос- большая ли разница чем ошибочно изменять поля класса- подобными вызовами геттеров или непосредственно обращаясь к полю, сделав его public? Разницы никакой, что так плохо, что эдак. Так что следите, что называется за руками, а не за уровнем доступа к полю.
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
02.04.2012, 03:23     Свойства класов - зачем помещать свойство в приват #39
А меня аргумент "потому, что так правильно" вполне устраивает, если произнесён кем-то сведующим в вопросе. Причины, по которым "так надо", станут понятны по мере приобретения опыта. Читаю книжку Perl Cookbook Тома Кристиансена и Натана Торкингтона (по мере прочтения проникся искренним уважением к авторам, к тому же в самой документации perl сплошь и рядом ссылки на эту книгу). В perl поддержка ООП вообще весьма своеобразно сделана. В частности нет стандартных средств языка для ограничения доступа к данным класса (что, в прочем не мешает истинным параноикам запрятать данные так, что захочешь - не доберёшься), но вот, что пишут авторы по этому поводу:
Работа методов зависит от того, как вы организуете открытый интерфейс к объекту. Нормальный класс не любит, чтобы окружающие копались у него во внутренностях. Для каждого атрибута данных должен существовать метод, обеспечивающий его чтение или обновление. Если пользователь пишет фрагмент вида:
Perl 6
1
2
3
$him = Person->new();
$him->{NAME} = "Sylvester";
$him->{AGE} = 23;
он нарушает интерфейс объекта и напрашивается на неприятности.
Ну а в С++, где есть способ запретить пользователю прямой доступ к данным класса, просто грех этим не воспользоваться. Разумеется, если класс не просто хранит значения переменной plain типа, при этом не заботясь о смысле и допустимости этих самых значений...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 10:16     Свойства класов - зачем помещать свойство в приват
Еще ссылки по теме:

Можно ли помещать в вектор разные объекты? - C++
у меня разные 3 вида объекта. Но у них есть несколько общих свойств, по которым нужно будет сделать сортировку. Так вот как быть. С...

Перегрузка опереторов для пользовательских класов - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;string&gt; #include &lt;cmath&gt; #include &lt;windows.h&gt; using namespace std; ...

Ошибка в коде при использовании класов - C++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;time.h&gt; #include &lt;stdio.h&gt; using namespace std; class Hello { int money,...

Наследование класов. Не могу понять в чем ошибка - C++
Не могу понять где ошибка. Задание:Написать программу, в которой создается иерархия классов. Определить в классах необходимые конструктор и...

Реализовать пул потоков, в который можно помещать функцию - C++
не могу реализовать как в книге главу 9 пул потоков который,в который можно помещать функцию что бы она возвращала значение вот код который...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
02.04.2012, 10:16     Свойства класов - зачем помещать свойство в приват #40
kravam, Крайне интересно, это каким же макаром, вызов геттера может изменить нечто в классе? Геттер обязан быть константным методом, геттер обязан ничего не менять в классе. И тогда не будет таких проблем, которые вы описываете.
А вот сеттером изменить можешь.
Yandex
Объявления
02.04.2012, 10:16     Свойства класов - зачем помещать свойство в приват
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru