2013-12-12 2 views
3

Так что я не знаю, были ли вы, кто-то из вас был/поступил в NewBoston.Com (отличный ресурс, кстати), но я смотрел это видео, и учитель говорил, как вы можете получить доступ к личной информации, используя публичные функции ...Как получить доступ к приватным переменным, используя публичные функции?

Это видео: http://www.youtube.com/watch?v=jTS7JTud1qQ

И, конечно же, только пропустить до конца, чтобы добраться до сути этого.

Вещь, которую я не понимаю, заключается в том, как вы можете получить доступ к личной информации с помощью публичной функции. Если вы создаете функцию, которая является общедоступной, которая позволяет кому-либо установить имя и получить это имя, то разве это не просто публично ?, Не мог бы кто-нибудь испортить мой код и мой желаемый результат?

ответ

6

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

Существует не много различий между

class A { 
    public: 
     int age; 
} 

и

class B { 
    private: 
     int age; 
    public: 
     void setAge(int _age); 
} 

B::setAge(int _age) { 
    this->age = _age; 
} 

Но, во втором случае, вы можете добавить логику, которая отвергает некоторые данные (VG отрицательного значения) или обновлением другие поля. Таким образом, вы можете гарантировать, что данные вашего объекта останутся неизменными. Если вы будете следовать первому подходу, эта логика должна воспроизводиться каждый раз, когда свойство будет доступно напрямую (обратите внимание: многие программисты забудут это сделать).

+0

Думаю, я понимаю, что вы имеете в виду. Итак, я думаю, что это его суть: Вы можете отредактировать то, что ТИП данных создается, задав тип данных, ожидаемых как частные, так как вы хотите согласованности. Но сами данные, вводимые другими пользователями, должны быть общедоступными, что не имеет значения для программиста, если они могут контролировать тип и поток данных? Я думаю, вы могли бы использовать эту аналогию: Вы хотите, чтобы ручка имела место для просачивания чернил, кнопку, которую вы можете щелкнуть, чтобы вытащить-снимите (?) Кончик, кадр, но точный тип не имеет значения , только требуемые детали? Если вы меня доставите. –

+0

Одним из преимуществ инкапсуляции (скрытия внутренних деталей) является то, что вы можете изменить детали реализации класса/модуля, не затрагивая (и не нуждаясь в изменении) остальную часть кода, но это не единственный. Например, мой пример говорит о поддержании согласованного внутреннего статуса. – SJuan76

0

Цель с публичными «геттерами/сеттерами», если хотите, заключается в том, что они ограничивают пользователя от выполнения большего, чем вы хотите. Вместо того, чтобы получать/настраивать частный член (в котором они могут что-либо сделать), вы можете ограничить то, что они могут/не могут сделать, обернув частный член в общедоступный accessor. Таким образом, внутри этого общедоступного свойства/функции вы можете ограничить значение, которое они могут установить.

Вы также можете просто открыть публичную собственность/функцию частному пользователю, но не позволяйте пользователю устанавливать его.

1

Извините, я не смотрю видео, но предполагаю, что вы говорите о вещах вроде getters (функции для получения значения свойства - частный член данных в этом случае) и сеттеры (функции для установки эти значения).

Если вы предоставляете геттеры и сеттеры в качестве сквозных сквозных функций, тогда вы правы, это действительно не так уж и отличается от того, как просто публиковать участников. Обычное использование, однако, заключается в том, чтобы обеспечить интеллект в ваших функциях доступа, что позволяет, например, устанавливать ограничения на значения, которые могут быть установлены или позволять извлекаемые значения вычисляться, а не только на основе чистого значения.

-2

Код с геттерами/сеттерами считается «лучше», чем прямой доступ к частному члену, поскольку эти функции могут затем контролировать все входные/выходные данные этих переменных и убедиться, что он относится к типу, диапазону или тому, что класс надеется. Это способ для создателя класса проверять ошибки, устанавливая или обрабатывая данные перед его возвратом.

Если вы могли бы просто сделать class.var = value; вы можете обманывать вещи, помещая неправильный тип переменной или переполняя некоторый предел, или даже вводить законное значение, с которым ломается какая-то логика в коде класса. Для простых вещей с одним разработчиком это обычно не большая проблема, но для фактического профессионального кода очень хорошая практика заключается в инкапсуляции переменных-членов в пару get/set для доступа/записи.

+3

Для настоящего профессионального кода очень хорошая практика не писать геттеры и сеттеры для каждого члена данных, который у вас есть только ради него. –

+0

Нет. Но это не место для обсуждения, поэтому я просто займусь и отправлю вам соответствующий вопрос здесь, на SO. –

+0

http://stackoverflow.com/a/12108025/560648 –

2

Создание тривиальных геттеров и сеттеров (публичных функций), по моему мнению, немного бесполезно. Если функциональность вашего класса полностью выражена частными переменными, то тривиальные геттеры и сеттеры представляют собой отходы и некоторые запахи кода. Возможно, вы должны использовать структуру вместо этого.

Однако публичные функции могут предоставлять интерфейс, который будет определять использование класса и ограничивает то, что вы можете делать с частными членами. Вы не хотите, чтобы пользователи вашего класса изменяли отдельные частные члены, которые имеют смысл только при изменении шага синхронизации.

Он также позволяет изменять реализацию, не меняя интерфейс. Например, вы хотите увеличить размер хэш-карты. Код Псевдо:

class IntHashMap { 
public: 
void increaseSize(int size); 
// Other stuff. 

private: 
int* backing_array_ ; 
int size_; 
} 

Теперь ваша реализация для increaseSize() может на самом деле проверить, если новый размер больше, чем предыдущий. Он также может создать новый файл backing_array и скопировать данные. Предоставление частного размера переменной не приведет ни к проверке правильности значения размера, ни к распределению нового массива поддержки.

0

Если вы не смогли получить доступ к личным данным из открытых функций, вы сможете получить к нему доступ только из частных функций, справа. Тем не менее, вызов частных функций из публичных функций также должен быть запрещен, поэтому ...

Как вы должны получить доступ к личным данным вообще?

Смежные вопросы