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

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

Войти
Регистрация
Восстановить пароль
 
SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
#1

Доступность полей при чтении из файла - C++

09.04.2014, 20:44. Просмотров 244. Ответов 5
Метки нет (Все метки)

Читая книгу Дейтела по С++, наткнулся на неясный код. В книге автор реализует задание:

Кликните здесь для просмотра всего текста
Создать для компании, которая может иметь до 100 клиентов,
программу для обработки кредита, которая способна хранить до 100 записей
фиксированной длины. Каждая запись должна состоять из полей номера
счета (служащего ключом записи), фамилии, имени и баланса счета.
Программа должна обеспечивать обновление счета, вставку нового счета,
удаление счета и вывод записей для всех счетов в форматированный
текстовый файл для распечатки.

Он реализует класс ClientData, в полях которого хранятся сведения (фамилии, счета, имена и т.д.). Поля класса закрыты, а доступ к ним осуществляется посредством get и set функций (в том числе и в конструкторе).
В примере, автор демонстрирует побайтовую запись из объектов этого класса(функция write из <fstream>), а затем и чтение из файла в эти объекты (read из <fstream>).

Вопрос вот в чем: почему он может получить доступ к закрытым полям класса, в то время как read и write не объявлены друзьями класса?

ЗЫ. Показать код не представляется возможным, т.к. копирование его - слишком трудоемкий процесс.

Добавлено через 18 минут
Забыл указать, как вызываются эти функции.

C++
1
2
3
outCredit.write( reinterpret_cast< const char * >( (client ), sizeof( ClientData ) ); 
 
inCredit.read( reinterpret_cast< char * >( ficlient ), sizeof( ClientData ) );
Может доступ возможен потому что мы приводим к const char*?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2014, 20:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Доступность полей при чтении из файла (C++):

Ошибка при вызове метода класса, при чтении из файла - C++
добрый день, пытаюсь считать данные из и запихнуть их в список в файле у меня вот такие данные a01 b10 А и Б надо запихнуть в...

Expression при чтении из файла - C++
Добрый день. Не могу понять - при чтении файла вылетает ошибка(экспрешн stream!=NULL) притом файл создан там же где main.cpp ...

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

Абракадабра при чтении из файла - C++
Добрый вечер! Имеется файл, в котором записан двумерный символьный массив, представляющий собой схему графа, например такой: 0 A B C D...

Иероглифы при чтении из файла - C++
Привожу код, в котором создаю, файл записываю в него данные. Затем пытаюсь их считать, выводит иероглифы... Что не так?. Спасибо. ...

Проверка при чтении из файла - C++
Добрый вечер! В своей программе на одном из этапов я построчно считываю целые числа из файла *.txt. Мне нужно чтобы в файле были только...

5
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2014, 21:48 #2
Цитата Сообщение от SMYH Посмотреть сообщение
Вопрос вот в чем: почему он может получить доступ к закрытым полям класса, в то время как read и write не объявлены друзьями класса?
Он - это кто? Где read и write обращаются к полям класса? Создан объект класса, write() записывает память под этим объектом в файл, read() читает данные из файла в память под объектом. Никто к полям класса не обращается.
0
SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
09.04.2014, 22:35  [ТС] #3
Он - это автор.
read() записывает данные в память, в то место, где хранится объект класса. То есть мы изменяем значения полей. Разве это не так? Содержимое памяти изменяется, а значит изменяется и содержимое полей.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2014, 22:50 #4
Цитата Сообщение от SMYH Посмотреть сообщение
То есть мы изменяем значения полей. Разве это не так?
Так, но изменяем без доступа к полям. Чтобы невозможно было изменять память под объектом, нужно поместить объект в приватный раздел класса (сделать полем класса). Приватность раздела класса не предполагает невозможность изменения всей памяти под объектом, с таким разделом. Примите как данность.
0
SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
09.04.2014, 22:57  [ТС] #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Чтобы невозможно было изменять память под объектом, нужно поместить объект в приватный раздел класса (сделать полем класса)
То есть, например, чтобы невозможно было записать или прочитать данные из ВСЕГО объекта используя read и write, нужно чтобы объект сам был приватным членом класса?
Цитата Сообщение от alsav22 Посмотреть сообщение
Приватность раздела класса не предполагает невозможность изменения всей памяти под объектом, с таким разделом.
Но тогда остается возможность несанкционированного доступа к закрытым полям класса. Даже если группа байт не сможет быть декодирована во что-то связное, то, в крайнем случае, можно просто стереть содержимое объекта.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2014, 22:59 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вопрос выходит за рамки приватных разделов класса. Это вопрос о способах защиты памяти под переменными. Ведь объект класса - это такая же переменная, только пользовательского типа. Сама память, под обектом, ничего не знает о приватном разделе в этом объекте. Один из способов запрета изменения памяти под переменной (объектом) - объявить переменную как const.
1
09.04.2014, 22:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2014, 22:59
Привет! Вот еще темы с ответами:

фейл при чтении из файла - C++
Вот абсолютно работоспособный код, где чтение и запись выполняются непосредственно в main. #include &lt;iostream&gt; #include &lt;fstream&gt; ...

bool при чтении из файла - C++
задание такое Сделайте функцию чтения из файла такой, чтобы она возвращала bool (истина - если считали данные, ложь - если нет) и...

Зацикливание при чтении из файла - C++
Пытаюсь читать из файла данные,сохраненные из Экселя TempBook-&gt;SaveAs(PathFile+&quot;\\&quot;+&quot;Temp&quot;,Excel::xlCSV , &amp;vtMissing, &amp;vtMissing,...

Ошибка при чтении файла - C++
Есть вот такой код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;iomanip&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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