Программирование >>  Аргументация конструирования 

1 ... 50 51 52 [ 53 ] 54 55 56 ... 108


/

<< pNDS->nSocial3ecurity \n ;


int main(int argc, char* pArgs[]) {

cout << Считываем имя/номер социалвного страхования \п Введите it в поле имени для выхода\п ;

создадим объект класса NameDataSet NameDataSet* pNDS; while (pNDS = getDataO)

добавим его в конец списка объектов NameDataSet addTail(pNDS);

поочередно выведем все элементы списка (выполнение прекратится, когда указатель

на следующий элемент будет равен нулю)

cout Элементы:\п ; pNDS = pHead; while(pNDS)

отобразим текущий элемент displayData(pNDS);

получим адрес элемента

pNDS = pNDS->pNext;

return 0;

Несмотря на внушительную длину, программа относительно про-

ста. Функция main () начинается с вызова функции getData (), которая считывает элемент NameDataSet с клавиатуры. Если пользователь вводит строку exit в поле имени, getData () возвращает ноль. Функция main (} вызывает функцию addTail (), чтобы добавить элемент, который вернула getData (), в конец связанного списка.

Если от пользователя больше не поступает элементов NameDataSet, функция

main () выводит на экран все элементы списка, используя функцию displayData ().

Функция getData () выделяет из кучи пустой объект класса NameDataSet. После этого getData () ожидает ввода имени для записи его в соответствующее поле нового объекта. Если пользователь вводит в поле имени строку exit , функция уничтожает последний созданный объект и возвращает 0. В противном случае getDataO считывает фамилию и номер социального страхования, после чего обнуляет указатель pNext

и передает управление вызывающей функции.

Никогда не оставляйте связывающие указатели не проинициализирован-ными! Старая поговорка программистов гласит: Пе уверен - обнули .

Функция addTail () из приведенного примера схожа с предыдущей версией addTail О, однако в отличие от нее она проверяет, не является ли данный список пустым. Если указатель pHead нулевой, то addTail О записывает в него указатель на текущий элемент и прекращает выполнение.

Функция displayData () неоднократно встречалась нам ранее.



Гл16

Защищенные члены класса: не беспокоить!

В э/ной главе...

Защищенные члены У Чем хороши защищенные члены Обращение к защищенным членам

главе 13, Классы в C + + , рассматривалась концепция классов. Ключевое слово public было описано как часть объявления класса, т.е. просто как то, что следует делать. В этой главе вы узнаете, что ключевому слову public есть альтернативы.

Защищенныечлены

Члены класса могут быть помечены как защищенные, что делает их недоступными извне класса. В отличие от защищенных, открытые (public) члены класса доступны для всех.

Зачем нужны защищенные члены

Для того чтобы понять смысл защиты членов класса, нужно вспомнить, каковы

цели объектно-ориентированного программирования.

1 Зашита внутренних элементов класса от внешних функций. Ведь когда I вы нроектируете микроволновую нечь (или что-нибудь другое), то ос? нащаете ее но возможности простым интерфейсом с внешним миром i и прячете содержимое в металлический ящик. Так делается для того, [ чтобы другие не могли поломать микроволновую печь. Защита членов 1 класса выполняет роль железного ящика.

; / Создание класса, способного полноценно управлять своими внутрен-I ними членами. Несколько непоследовательно требовать от класса полноценной работы и ответственности за ее результаты и одновременно позволять внешним функциям манипулировать его внутренними чле-I нами (это то же самое, что и требовать от создателя микроволновой пе-I чи нести ответственность за мои непрофессиональные манипуляции I с элементами ее внутреннего устройства).

5 У Сокращение до минимума внешнего иптерфейса класса. Гораздо проще i изучать и использовать класс, который имеет ограниченный интерфейс I (а интерфейсом класса являются его открытые члены). Защищенные члены скрыты от пользователя, и их не надо помнить (в противном I случае интерфейсом становится весь класс). Такой подход называется I абстракцией, которая описана в главе 8, Первое знакомство с указате-

I ЛЯМИВС + + .



Уменьшение уровня взаимосвязи между классом и внешней I мой. Ограничив взаимосвязь класса с внешним кодом, при необходи-I мости гораздо проще заменить класс каким-либо другим.

Я так и слышу, как поклонники функционального подхода говорят: Не нужно делать ничего противоестественного! Достаточно потребовать от программиста, чтобы он попросту не трогал некоторые члены класса .

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

Как устроены защищенные члены

Добавление в класс ключевого слова public делает все находящиеся за ним члены класса открытыми, а значит, доступными для функций - не членов класса. Использовав ключевое слово protected, вы делаете все последующие члены класса защи-щепными, т.е. недоступными для функций, которые не являются членами класса. Переключаться между защищенными и открытыми членами класса можно сколько угодно.

Допустим, у нас есть класс student. В приведенном ниже примере представлены все необходимые возможности, которые нужны классу, описывающему студента (за исключением разве что функций spendKoney (тратить деньги) и drinkBe r (нить ни-

во), которые тоже являются свойствами студента):

addCourse (int iiours, float grade) - добавить нройденный курс; grade - вернуть текущую среднюю оценку; hours () - вернуть количество пройденных часов.

Оставшиеся члены класса можно объявить как защищенные, чтобы дру-

гие функции пе могли лезть во впутренние дела класса Student.

class Student

public:

grade - возвращает текущую среднюю оценку

float graded

return gpa;

hours - возвращает количество прослушанных часов

int hours О

return semesterHours;

addCourse - добавляет к записи студента

прослушанный курс

float addCourse(int hours, float grade)

приведенные ниже члены недоступны для внешних функций

protected:

int прослушанных часов

float gpa; средняя оценка

Теперь члены semesterHours и gpa доступны только из других членов класса Student, и приведенный ниже пример работать не будет.

Student s;

in (int argc, char* pArgs [ ] ) {



1 ... 50 51 52 [ 53 ] 54 55 56 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика