Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
SMYH
2 / 2 / 1
Регистрация: 23.10.2013
Сообщений: 38
1

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

09.04.2014, 20:44. Просмотров 892. Ответов 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
Ответы с готовыми решениями:

"Нарушение прав доступа при чтении по адресу" при чтении структур из бинарного файла
Пытаюсь разобраться со структурами в бинарных файлах. Допустим, есть массив структур. Записываю...

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

Абракадабра при чтении из файла
Добрый вечер! Имеется файл, в котором записан двумерный символьный массив, представляющий собой...

Ошибка при чтении из файла
Файл открывается, но читаться из него информация не хочется. Исходник int c_array ::...

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

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

Решение

Вопрос выходит за рамки приватных разделов класса. Это вопрос о способах защиты памяти под переменными. Ведь объект класса - это такая же переменная, только пользовательского типа. Сама память, под обектом, ничего не знает о приватном разделе в этом объекте. Один из способов запрета изменения памяти под переменной (объектом) - объявить переменную как const.
1
09.04.2014, 22:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2014, 22:59

Ошибка при чтении файла
Необработанное исключение по адресу 0x0FE4172C (msvcp140d.dll) в .exe: 0xC0000005: нарушение прав...

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

Проверка при чтении из файла
Добрый вечер! В своей программе на одном из этапов я построчно считываю целые числа из файла...


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

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

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