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

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

26.01.2016, 22:56. Просмотров 274. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2016, 22:56
Ответы с готовыми решениями:

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

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

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

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

3
1 / 1 / 0
Регистрация: 11.12.2015
Сообщений: 24
26.01.2016, 23:41  [ТС] 3
Я как раз по Лафоре и учу. И тем не менее вопрос не снят..
0
333 / 181 / 80
Регистрация: 22.08.2013
Сообщений: 724
27.01.2016, 00:47 4
Цитата Сообщение от Гр Хо Посмотреть сообщение
И тем не менее вопрос не снят..
Если присутствует виртуальность, не нужно память под объектами записывать/читать.
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2016, 00:47

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

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

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