powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
24 сообщений из 24, страница 1 из 1
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38094839
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озадачился поиском ошибок памяти. Решил, что надо разделить программу логически так, чтобы сначала данные для объекта накапливались ("писались"), а потом использовались ("читались"). Это позволит:

1. Не допустить записи после первой части программы (путем удаления первого интерфейса).
2. После записи рассчитать контрольную сумму и после всех чтений (вторая часть программы) произвести сравнение на поиск модификаций данных объекта другими частями программы.

Разумеется разделение на "первая часть программы" и "вторая часть программы" для каждого объекта индивидуальны.

Никак не придумаю схему, чтобы ОДИН объект обладал одним набором переменных (в моем случае- гигантские массивы), но разным набором функций для каждой части программы. Например, создать виртуальный базовый класс "Data" с переменными и от него унаследовать два класса "Read" и "Write" будет ошибкой, поскольку данных во время выполнения программы будет два комплекта.

Как сделать подобное функциональное разделение?
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38094910
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О каких ошибках памяти идёт речь?
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38094965
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonО каких ошибках памяти идёт речь?

1. Ошибка программирования: я вызываю метод объекта для записи данных, где этой записи быть не должно (при больших программах, состоящих из нескольких модулей, подобное трудно отследить).
2. С помощью прямого доступа к памяти какой-то метод записывает данные в private члены моего объекта.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095004
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Походу получится создать три объекта "Data", "Write" и"Read", причем два последних в качестве поля будут содержать общий ранее созданный первый объект "Data". Так удастся сохранить уникальность данных и в тоже время в нужный момент создавать/удалять возможности записи/чтения.

Нет подводных камней (типа падения производительности или еще чего)?
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095012
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по идее уже в конструкторе вы должны создать "полноценный" объект с таким состоянием, что любые попытки "чтения" из класса, то есть вызовы методов, возвращающих некие данные, будут завершены успешно
далее, все вызовы методов, "помещающие" данные в классы, должны писаться так, чтобы не нарушать согласованное состояние данных в классе
таким образом, достаточно правильно написанных конструкторов и проверок на корректность (обычные if плохие данные в параметрах, то сгенерить исключение или вернуть ошибку) в тех методах, которые меняют состояние объекта
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095056
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kosh the bestпо идее уже в конструкторе вы должны создать "полноценный" объект с таким состоянием, что любые попытки "чтения" из класса, то есть вызовы методов, возвращающих некие данные, будут завершены успешно
далее, все вызовы методов, "помещающие" данные в классы, должны писаться так, чтобы не нарушать согласованное состояние данных в классе
таким образом, достаточно правильно написанных конструкторов и проверок на корректность (обычные if плохие данные в параметрах, то сгенерить исключение или вернуть ошибку) в тех методах, которые меняют состояние объекта


Ну по-моему 100% мимо кассы:

1. Конструкторы объектам "Write" и "Read" не нужны, так как они всего-лишь добавляют методы работы с данными "Data".
2. Проверка на корректность в методах изменения состояния объекта также не нужна, поскольку она будет проведена при расчете контрольной суммы после после всех записей в конце первой части программы. А сравнение контрольных сумм после всех чтений (в конце второй части программы) подтвердит, что все данные сохранились корректно.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095066
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Ну по-моему 100% мимо кассы
ну ваше дело
изобретайте велосипед
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095076
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanVmaytonО каких ошибках памяти идёт речь?

1. Ошибка программирования: я вызываю метод объекта для записи данных, где этой записи быть не должно (при больших программах, состоящих из нескольких модулей, подобное трудно отследить).

Значит это не ошибка памяти а ошибка программирования?
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095078
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kosh the best> Ну по-моему 100% мимо кассы
ну ваше дело
изобретайте велосипед

Не обижайся, бро :)
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095080
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanV1. Ошибка программирования: я вызываю метод объекта для записи данных, где
этой записи быть не должно
Сделай объект с одним объявлением и двумя реализации. Программу собирай с той реализацией,
где любой метод записи выбрасывает ошибку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095082
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonGermanVпропущено...


1. Ошибка программирования: я вызываю метод объекта для записи данных, где этой записи быть не должно (при больших программах, состоящих из нескольких модулей, подобное трудно отследить).

Значит это не ошибка памяти а ошибка программирования?

Это ошибка доступа к памяти: в данном месте кода не должно быть записи (или чтения). Называйте это как хотите.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095085
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovGermanV1. Ошибка программирования: я вызываю метод объекта для записи данных, где
этой записи быть не должно
Сделай объект с одним объявлением и двумя реализации. Программу собирай с той реализацией,
где любой метод записи выбрасывает ошибку.


Ничего не понял. У меня должны быть как методы записи (первый этап программы), так и чтения (второй этап программы). Собирать программу надо с обеими возможностями.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095091
Фотография kosh the best
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уж если хотите, то можете сделать к вашему объету Foo два интерфейса, положим FooWrite и FooRead, на этапе заполнения данными работать через FooWrite, в конце записи вызовете метод проверки целостности записанных данных, далее работать только через интерфейс FooRead, который будет предоставлять только методы на чтение, не изменяющие состояния объекта
hint: интерфейсы в с++ реализуются через базовые абстрактные классы
но, повторяюсь, этого совсем не нужно делать, делайте проще
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095129
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kosh the bestуж если хотите, то можете сделать к вашему объету Foo два интерфейса, положим FooWrite и FooRead, на этапе заполнения данными работать через FooWrite, в конце записи вызовете метод проверки целостности записанных данных, далее работать только через интерфейс FooRead, который будет предоставлять только методы на чтение, не изменяющие состояния объекта
hint: интерфейсы в с++ реализуются через базовые абстрактные классы
но, повторяюсь, этого совсем не нужно делать, делайте проще

Если я создам два абстрактных базовых класса "Write" и "Read", от которых унаследую два класса с данными "Write_Data" и "Read_Data", то у меня получится ДВА объекта. А надо, чтобы сущность была одна.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095175
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanVА надо, чтобы сущность была одна.
Тогда оберни доступ к объекту в процедуры и объяви эти процедуры в разных заголовках.
Директивами препроцессора сделай так, чтобы эти заголовки не могли быть подключены
одновременно. Попытка обратиться к процедурам из неподключенного заголовка будет вызывать
ошибку компиляции.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095206
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovGermanVА надо, чтобы сущность была одна.
Тогда оберни доступ к объекту в процедуры и объяви эти процедуры в разных заголовках.
Директивами препроцессора сделай так, чтобы эти заголовки не могли быть подключены
одновременно. Попытка обратиться к процедурам из неподключенного заголовка будет вызывать
ошибку компиляции.


А как потом в модуле "отключить" заголовок с файлом, реализующим запись?

Да и коряво это: структура файлов должна отражать модульность программы и коррелировать с пространствами имен (Страуструп, Глава 9 Исходные файлы и программы).
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095212
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanV, вот когда нужно, ты умеешь цитировать великих.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095230
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanV,

вот любил бы ты линукс, писал бы кроссплатформенные программы, там это всё ищется на раз, без всяких переделок программы.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095249
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivGermanV,

вот любил бы ты линукс, писал бы кроссплатформенные программы, там это всё ищется на раз, без всяких переделок программы.

Можно подробнее?
1. Что означают слова: "там это всё ищется на раз, без всяких переделок программы"?
2. Какие средства есть у кроссплатформенных программ, по сравнению с Win32- программами, позволяющие данные действия?
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095266
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanVА как потом в модуле "отключить" заголовок с файлом, реализующим запись?

Зачем его отключать? У тебя по постановке задачи один модуль должен осуществлять только
запись в объект, а другой - только чтение. Именно это и отражает структура файлов.

maytonвот когда нужно, ты умеешь цитировать великих.
Вот бы он ещё кроме умения цитировать проявлял понимание цитированных идей...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095278
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovGermanVА как потом в модуле "отключить" заголовок с файлом, реализующим запись?

Зачем его отключать? У тебя по постановке задачи один модуль должен осуществлять только
запись в объект, а другой - только чтение. Именно это и отражает структура файлов.

Как ни крути, из первоначального модуля мне нужно сначала дать команду "записать" (значит файл с процедурами записи данных должен быть доступен), а потом дать команду "прочитать" (значит файл чтения данных должен быть доступен, а записи данных- нет). И как не "углубляй" эти вызовы, все равно запись во время чтения будет доступна.
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095285
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GermanVиз первоначального модуля мне нужно сначала дать команду "записать" (значит
файл с процедурами записи данных должен быть доступен), а потом дать команду "прочитать"
(значит файл чтения данных должен быть доступен, а записи данных- нет). И как не
"углубляй" эти вызовы, все равно запись во время чтения будет доступна.
Это неправильно. Это недостаточная модульность. Раздели свой модуль на два и будет всё по
Страуструпу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095325
GermanV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovGermanVиз первоначального модуля мне нужно сначала дать команду "записать" (значит
файл с процедурами записи данных должен быть доступен), а потом дать команду "прочитать"
(значит файл чтения данных должен быть доступен, а записи данных- нет). И как не
"углубляй" эти вызовы, все равно запись во время чтения будет доступна.
Это неправильно. Это недостаточная модульность. Раздели свой модуль на два и будет всё по
Страуструпу.


И эти два модуля подключи к одному центральному, откуда их вызывай. Так вот в этом центральном модуле все равно получится каша из доступных методов (доступны и чтение и запись).
...
Рейтинг: 0 / 0
Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
    #38095549
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По описанию вашей проблемы не очень ясно, что вам надо. Поэтому приходится включать телепатические способности. Насколько я понял,

Для решения озвученных вам задач существуют такие механизмы:

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

- использовать бликировки

- Разновидность блокировок: использовать схему много читателей/один писатель.

- использовать неблокирующие алгоритмы. В общем случае - это некоторый механизм, который определяет, что к ресурсу был одновременный доступ из нескольких потоков, и предпринимает повторную попытку внести в ресурс правку.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как для одного объекта создать два непересекающихся интерфейса (чтение/запись)?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]