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

Запись и чтение объектов разных классов в один файл - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Не запускает программу после компиляции http://www.cyberforum.ru/cpp-beginners/thread638886.html
Дело в том что когда проверяю код на ошибки всё нормально, но когда нажимаю "запустить" мне выдает что его нужно сначала откомпеллировать. Лазила в настройках, устанавливала разные среды, везде одна и таже ошибка. У меня еще такой вопрос: влияет ли ОС на это? Дело в том что когда у меня стояла лицензия таких ошибок не было, но после переустановки на пиратскую винду (хр) у меня возникли эти...
C++ Код Enter Как мне прописать условие: если нажата кнопка enter http://www.cyberforum.ru/cpp-beginners/thread638867.html
C++ Хранение глобального массива с объектами
Добрый день всем. У меня есть vector с объектами. И надо чтобы он был доступен по всех классах.( отдельных файлах ). Чтобы я мог менять его значения по ссылке. Как лучше реализовать такое хранилище? В виде глобальной переменной - говорят плохо. Заранее спасибо!
C++ таймер c++
Всем привет. Прошу вас помочь мне в слудующем: нужен простой таймер(среда visual c++ express выпуск),который отключит вот эту функцию через 20 секунд после включения Сама функция: if(opt.other.аст==1) {MEMwrite((void *)(ast),(void *)"\xC3",1);} if(opt.other.аст==0) {MEMwrite((void *)(ast),(void *)"\x55",1);}
C++ Действие при нажатии Enter http://www.cyberforum.ru/cpp-beginners/thread638840.html
Вот недавно здесь нашел код: #include "stdafx.h" #include <conio.h> #include <string> #include <fstream> #include "iostream" #include <windows.h> using namespace std;
C++ Как создать механические часы (с циферблатом и стрелками) Всем привет) Мне в универе задали написать мех. часы, но как я поняла, они создаются при помощи классов... Меня это удивило, потому что нам говорили, что мы только на след. год будем работать с классами... Скажите, можно ли их создать без классов?) подробнее

Показать сообщение отдельно
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
20.08.2012, 21:53     Запись и чтение объектов разных классов в один файл
moskitos80, особо в коде не разбирался, но увидел там наличие виртуальных функций, а также логику чтения/записи, основанную на сыром чтении/записи объекта из/в файл (по сути в файл записывается бинарный слепок объекта). Так вот, это наводит на следующие мысли:
Поскольку классы, объекты которых вы пишите-читаете, участвуют в полиморфной иерархии (используют виртуальные функции), каждый из таких объектов содержит в себе дополнительный указатель - адрес таблицы виртуальных функций для типа данного объекта. Именно на основе этого адреса и соответствующего смещения в таблице адрес необходимой функции вычисляется во время выполнения [реализация динамического полиморфизма стандартом не описывается, но обрисованная мной схема используется практически всегда, и не только в С++].
Теперь далее. Логика подсказывает, что таблица виртуальных функция генерируется на стадии компиляции единожды (поскольку сама по себе статична и известна компилятору на момент компиляции), и адрес её вычисляется единожды на стадии компиляции, а то, что в современных ОС используются виртуальные адреса, наводит на мысль, что теоретически таблица виртуальных функций при каждом запуске должна лежать по одному и тому-же (виртуальному) адресу, и, следовательно, такая сырая запись-чтение не должны ломать объект. Однако факты говорят, что при считывании объекта, вероятнее всего, происходит поломка за счёт того, что считанный адрес таблицы виртуальных функций не совпадает с реальным и указывает непонятно куда (возможно, за границы доступной приложению памяти, за счёт чего и вылазит сигфолт). При попытке вызвать виртуальный метод адрес берётся не из реальной таблицы, а из мусорной памяти, которая интерпретируется как таблица, и в результате программа падает либо при попытке обратиться по косвенности к таблице, либо при попытке выполнить как код функции некий мусор, который там оказался.
Итог: сырое чтение/запись в данном случае не подходят. Необходима более сложная логика сериализации. Таким образом, единый класс для чтения/записи уже не подойдёт, каждый конкретный объект должен уметь читать себя из файла/писать себя в файл (единый класс может иметь место, но он всё равно будет использовать реализацию чтения/записи, предоставляемую полиморфно реальным объектом).
Всё это только в теории, вполне возможно, что на самом деле у вас просто криво происходит запись или чтение, что и ломает рантайм, но, не разбираясь подробно в коде и просто чуть-чуть подумав, в голове появляется именно такая картинка.
 
Текущее время: 06:25. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru