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

Считывание класса с виртуальным наследованием из бинарного файла - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дан первый элемент последовательности и рекуррентная формула. Определить, сколько элементов... http://www.cyberforum.ru/cpp-beginners/thread532993.html
Написать на С+. Дан первый элемент последовательности a0=7 и рекуррентная формула a(i+1)=ai/(i+1)+i/ai . Определить, сколько элементов этой последовательности меньше введенного с клавиатуры значения.
C++ Указатели на указатели Есть указатель на тип int. Нужно написать функцию, которая бы принимала адрес этого указателя и присваивала ему адрес нового массива созданного внутри функции. Код: #include <stdio.h> #include <stdlib.h> #include <locale> void initArray(int**array_, int*m_size) { printf("Введите размер массива\n >> "); scanf("%d", &(*m_size)); http://www.cyberforum.ru/cpp-beginners/thread532980.html
вывод матрицы C++
почему выводит вместо одной матрицы пять штук? #include<stdio.h> #include<stdlib.h> #include<time.h> #include<iostream.h> #define m 7 #define n 5
Дано расстояние в сантиметрах.Найти число полных метров в нем C++
Дано расстояние в сантиметрах.Найти число полных метров в нем. Дублирование тем нарушает правила форума. Не делайте так больше!
C++ Заполнение массива и создание матрицы. http://www.cyberforum.ru/cpp-beginners/thread532932.html
Доброго времени суток. Формально я решаю задачу аппроксимации набора точек полиномом методом наименьших квадратов, но помощь мне нужна только в заполнении массивов и корректного создания матрицы для последующего применения метода гаусса. 1.Помогите создать массив, заполненный 10 элементами, не целыми. Просто как его задать в Visual C. 2.Создать матрицу, заполненную элементами x в...
C++ WinAPI основы Нужна элементарная синхронизация с помощью событий. что я делаю не так? #include "stdafx.h" #include <Windows.h> #include <vector> #include <iostream> #include <algorithm> using namespace std; подробнее

Показать сообщение отдельно
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.03.2012, 03:30     Считывание класса с виртуальным наследованием из бинарного файла
Цитата Сообщение от Riderik Посмотреть сообщение
это не POD класс
Да, именно на этом основывается моё предположение.
Цитата Сообщение от Riderik Посмотреть сообщение
он в памяти расположен не в одном месте
Суть не в этом, а в том, что для не POD-типа нельзя делать предположений о том, как он располагается в памяти. Об этом ниже.
В объектах класса, который виртуально наследует базовый класс, располагается специальный указатель на таблицу виртуальных классов (именно классов, не функций). Эта таблица содержит константные смещения, которые помогают добраться до той области памяти внутри объекта данного класса, которая содержит подобъект базового класса (ведь все данные в иерархии хотя и структурированы, в памяти лежат последовательно в пределах объекта). Так вот, моя идея в том, что когда запись объекта в файл и чтение его из файла происходят в пределах одного сеанса, то мы сначала записываем данные (в том числе и указатель на таблицу виртуальных классов!) в файл, а потом тут же читаем данные (в том числе и указатель на таблицу виртуальных классов!) обратно в объект. Понятно, что в пределах одного сеанса таблица размещается в одной и той же области памяти, и записав адрес в файл и тут же считав его обратно, мы ничего не испортим. Однако если мы записали адрес в одном сеансе и считали в другом, то никто не гарантирует, что адреса эти будут совпадать (с другой стороны, по идее-то гарантирует, но об этом ниже). Поэтому при чтении файла в новом сеансе мы считываем адрес, который может быть совершенно левым, обращаемся в память по этому адресу и получаем по башке от системы, которая нас в эту память пускать категорически отказывается.
Однако нестыковка здесь вот в чём. Вся информация о таблице виртуальных классов известна уже на стадии компиляции. Значит, эту таблицу можно разместить статически (что обычно и делается). Значит, в пределах программы у неё всегда будет фиксированный адрес. Значит, нет никаких проблем сохранить этот адрес в одном сеансе, а считать в другом, адреса должны быть одинаковы. Что и показывает моя попытка воспроизвести вашу ошибку (вернее, неудача этой попытки). Получается, что это особенность именно вашего компилятора, или я что-то упустил или где-то ошибся...

Добавлено через 2 минуты
Но, как бы то ни было, нельзя так сериализовать объекты, строение которых не оговорено стандартом, потому как всё, что не оговорено, лежит на совести разработчиков компилятора, и реализация виртуального наследования может быть такой, как я описал, а может быть совершенно иной.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru