Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
1 / 1 / 0
Регистрация: 11.12.2015
Сообщений: 24

Файлы и объекты производных классов

26.01.2016, 22:56. Показов 969. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вопрос следующий: имеется два класса, базовый и производный.
В файл бинарно записывается объект производного класса через указатель на базовый. В итоге, как я понимаю у нас теряется часть данных и при чтении из файла мы получаем кривой оъект..
Проблема в том, что книга, по которой я учу язык, говорит - "чувак, можно писать в файл объект через указатель на его базовый класс, и все будет путем".. а у меня данные теряюся..
Дак можно ли все таки писать через указатель на базовый? И если да - что я делаю не правильно ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class base
{
   public:
      int data;
      char char_data[40];
      virtual void set_info(){ cout << "Введите data: "; cin >> data; cout << "Введите строку: "; cin >> char_data; }
      virtual void get_info(){ cout << this->data << '\t' << this->char_data << endl; }
};
 
class doter : virtual public base
{
   public:
      int new_data;
      virtual void set_info(){ base::set_info(); cout << "Введите new_data: "; cin >> this->new_data; }
      virtual void get_info(){ base::get_info(); cout << this->new_data << endl; }
};
 
***********
base* ptr;
   ptr = new doter;
   ptr->set_info();
   file.seekg( 0 );
   file.write( reinterpret_cast< char* >( ptr ), sizeof( doter ) );
   base* ptr_new = new doter;
   file.seekp( 0 );
   file.read( reinterpret_cast< char* >( ptr_new ), sizeof( doter ) );
   ptr_new->get_info();
***********
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.01.2016, 22:56
Ответы с готовыми решениями:

Функция создающая объекты производных классов
Функция получает входной параметр - целое число. Если оно равно 0, создается новый объект - окружность, если равно 3 - создается...

Абстрактный класс, массив указателей на объекты производных классов
У меня есть абстрактный класс: class abstract{ public: int field; double method(); }; В нем объявлены поле и метод. Далее...

Наследование классов. Копирование производных классов
Здравствуйте всем, у меня такой вопрос: написал код #include &quot;stdafx.h&quot; class A //Создаем класс А { int mA; ...

3
1 / 1 / 0
Регистрация: 11.12.2015
Сообщений: 24
26.01.2016, 23:41  [ТС]
Я как раз по Лафоре и учу. И тем не менее вопрос не снят..
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
27.01.2016, 00:47
Цитата Сообщение от Гр Хо Посмотреть сообщение
И тем не менее вопрос не снят..
Если присутствует виртуальность, не нужно память под объектами записывать/читать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
class base
{
   public:
      int data;
      char char_data[40];
      virtual void set_info()
      {
          cout << "Введите data: "; 
          cin >> data; cout << "Введите строку: "; 
          cin >> char_data; 
      }
      virtual void get_info()
      { 
          cout << data << '\t' << char_data << endl; 
      }
      virtual void out(fstream& f)
      {
            f.write(reinterpret_cast< const char* >(&data), sizeof(data));
            f.write(reinterpret_cast< const char* >(char_data), sizeof(char_data));
      }
      virtual void in(fstream& f)
      {
            f.read(reinterpret_cast< char* >(&data), sizeof(data));
            f.read(reinterpret_cast< char* >(char_data), sizeof(char_data));
      }
      virtual ~base()
      {}
};
 
class doter : virtual public base
{
   public:
      int new_data;
      virtual void set_info()
      { 
          base::set_info(); 
          cout << "Введите new_data: "; 
          cin >> new_data; 
      }
      virtual void get_info()
      { 
          base::get_info(); 
          cout << new_data << endl; 
      }
      virtual void out(fstream& f)
      {
            base::out(f);
            f.write(reinterpret_cast< const char* >(&new_data), sizeof(new_data));
      }
      virtual void in(fstream& f)
      {
            base::in(f);
            f.read(reinterpret_cast< char* >(&new_data), sizeof(new_data));
      }
      virtual ~doter()
      {}
};
 
int main()
{ 
    setlocale(0, "");
    
    fstream file("base.txt", ios::in | ios::out | ios::binary);
    
    base* ptr;
    ptr = new doter;
    ptr->set_info();
    
    file.seekp(0);
    ptr ->out(file);
    file.flush();
    
    base* ptr_new = new doter;
    
    file.seekg(0);
    ptr_new ->in(file);
    ptr_new->get_info();
    
    delete ptr;
    delete ptr_new;
    
    system("pause");
    return 0; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.01.2016, 00:47
Помогаю со студенческими работами здесь

Объекты классов не видны во вложенной функции одной из классов
Такая вот проблема. Есть функция play() класса Game, где создаются объекты классов Game, Character, Battle. В ней я обращаюсь к еще одной...

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

Сравнение производных классов
Друзья! Пусть у меня есть базовый класс S. У него есть два наследника A и B. Как мне скидывать, например в set, указатели (шаредпэтэры...

Занести из файла объекты производных классов в массив объектов базового класса
Здравствуйте. Что в этом коде изменить, чтобы объекты производных классов заносились из файла? using System; namespace...

Создание производных классов
Пожалуйста, помогите понять, в чем проблема. Не могу разобраться уже несколько дней. Всё делалось по примеру, но мой вариант не работает....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru