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

Запись класса в файл - C++

Восстановить пароль Регистрация
 
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 03:23     Запись класса в файл #1
Доброго времени суток!
Вот появился тупик, есть базовый класс и производные классы
Кликните здесь для просмотра всего текста
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
class Figure{
   protected:
        int x,y;
        TColor color;
        int size;
        int type;
   public:
        Figure(){};
        ~Figure(){};
        virtual void paint()=0;
 
        int getX(){return x;}
        int getY(){return y;}
        int getColor(){return color;}
        int getSize(){return size;}
        int getType(){return type;}
 
        void setX(int nX){x=nX;}
        void setY(int nY){y=nY;}
        void setColor(int nColor){color = nColor;}
        void setSize(int nSize) {size = nSize;}
        void setType(int nType) {type = nType;}
 
};
class FSquare: public Figure
{
        public:
        void paint();
        FSquare(int nx, int ny, int nc, int ns)
        {x=nx; y=ny; color = nc; size = ns;}
};
class FRectangle: public Figure
   {
        int st1,st2;
        public:
        void paint();
        FRectangle(int nx, int ny, int nc, int ns, int nst1, int nst2)
        {x=nx; y=ny; color = nc; size = ns; st1 = nst1; st2 = nst2;}
};
class FRhombus: public Figure{
        public:
        void paint();
        FRhombus(int nx, int ny, int nc, int ns)
        {x=nx; y=ny; color = nc; size = ns;}
};
class FEllipse: public Figure
   {
        int st1,st2;
        public:
        void paint();
        FEllipse(int nx, int ny,int nc,int ns, int nst1, int nst2)
        {x=nx; y=ny; color = nc; size = ns; st1 = nst1; st2 = nst2;}
};

ну и список указателей на базовый класс
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
struct List
   {
      Figure *fi;
      List *next;
   };

заполняю список так :
Кликните здесь для просмотра всего текста
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
 switch (fType)
    {
       case square:
       {  FSquare *f= new FSquare(X,Y,fColor,fSize);
            add_to(T,f);
          break;
       }
       case rectangle:
       {  FRectangle *f = new FRectangle (X,Y,fColor,fSize,fst1,fst2);
            add_to(T,f);
          break;
       }
       case fellipse:
       {
          FEllipse *f = new FEllipse(X,Y,fColor,fSize, fst1, fst2);
            add_to(T,f);
          break;
       }
      default:
      {
        FRhombus *f = new FRhombus(X,Y,fColor,fSize);
         add_to(T,f);
      }
      }
//------------------
void __fastcall  add_to(List *&T, Figure *f)
   {
      List *tmp = new List;
      tmp->fi = f;
      tmp->next = NULL;
      if (!T)
         T=tmp;
      else
         {
            List *l=T;
            while (l->next)
               l=l->next;
            l->next=tmp;
 
         }
      return ;
 
   };

вот собственно вопрос, как бы ЭТО лучше записать в файл?
мне в голову что то умное не лезет...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
27.06.2013, 03:30     Запись класса в файл #2
Я так понял, вас интересует структура файла, который будет содержать информацию о фигурах, да?
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 03:34  [ТС]     Запись класса в файл #3
@Khelleos, да, вот весь код создания фигур, и это надо как то в файл записать
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
27.06.2013, 03:51     Запись класса в файл #4
Как вариант следующий формат:
<тип фигуры> <x> <y> <color> <size>

Или вам нужна конкретно реализация?

Добавлено через 9 минут
Наследуемые классы вызывают конструктор класса Figure?
Вроде бы надо делать следующим образом:
C++
1
FSquare(int x, int y, TColor color, int size):Figure(0, x, y, color, size)
Ну и собственно конструктор для класса Figure.
C++
1
2
3
4
5
6
7
8
Figure(int _type, int _x, int _y, TColor _color, int _size) 
{
   type = _type;
   x = _x;
   y = _y;
   color = _color;
   size = _size;
}
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 06:42  [ТС]     Запись класса в файл #5
Цитата Сообщение от Khelleos Посмотреть сообщение
Как вариант следующий формат:
<тип фигуры> <x> <y> <color> <size>
я тоже так думал если бы не было у фигуры эллипс дополнительных 2х параметров

конструкторы работают хорошо
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
27.06.2013, 06:49     Запись класса в файл #6
Проверяете тип фигуры и дальше пишите то что надо.
Для эллипса будет так:
<тип фигуры> <x> <y> <color> <size> <st1> <st2>
Для других так:
<тип фигуры> <x> <y> <color> <size>

Когда будете считывать данные с файла, считайте сначала <type> и в зависимости от фигуры считаете оставшиеся данные в строке файла.
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 07:00  [ТС]     Запись класса в файл #7
@Khelleos,еще 1 вопрос
у меня есть список, в котом указатели на базовый класс, как мне через указатель на базовый класс вытянуть <st1> <st2> из производных классов?
Khelleos
37 / 37 / 7
Регистрация: 13.05.2010
Сообщений: 283
Записей в блоге: 1
27.06.2013, 07:32     Запись класса в файл #8
Думаю нельзя так.

По хорошему класс Figure сделать абстрактным(базовым, т.к. он содержит общие черты фигур. Один из инструментов ООП) и сделать шаблон для списка
C++
1
2
3
4
template <class T> struct LIST {
    T value;
    LIST *next;
};
И объявить отдельные списки для каждой фигуры. Пример
C++
1
LIST<FEllipse> listEllipse;
И дописать методы для класса FEllipse, через которые можно будет получить или установить значения st1 и st2.
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
27.06.2013, 07:32     Запись класса в файл #9
есть несколько способов, но все же советую просто перебросить st1,st2 в базовый класс, несмотря на то, что не во всех производных классах они будут использоваться.
почитайте вот здесь
думаю узнаете много полезного
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
27.06.2013, 14:32  [ТС]     Запись класса в файл #10
получился рабочий быдло код....

Кликните здесь для просмотра всего текста
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
void __fastcall f_write(List *T, FILE *&F)
   {
      List *tmp = T;
      while (tmp)
         {
            int ft=tmp->fi->getType();
            fwrite(&ft, sizeof(int),1, F ) ;
            int x0=tmp->fi->getX();
            fwrite(&x0, sizeof(int) ,1 ,F);
            int y0=tmp->fi->getY();
            fwrite(&y0, sizeof(int), 1, F);
            int col=tmp->fi->getColor();
            fwrite(&col, sizeof(int), 1, F);
            int siz=tmp->fi->getSize();
            fwrite(&siz, sizeof(int), 1, F);
            int s1=tmp->fi->getSt1();
            fwrite(&s1, sizeof(int), 1, F);
            int s2=tmp->fi->getSt2();
            fwrite(&s2, sizeof(int), 1, F);
            tmp=tmp->next;
         }
 
   };
 
void __fastcall f_read(List *&T, AnsiString str)
   {
      FILE *F=fopen(str.c_str(), "r");
      while (!feof(F))
         {
            int ft;
            fread(&ft,sizeof(int),1,F);
            int x0;
            fread(&x0, sizeof(int) ,1 ,F);
            int y0;
            fread(&y0, sizeof(int), 1, F);
            int col;
            fread(&col, sizeof(int), 1, F);
            int siz;
            fread(&siz, sizeof(int), 1, F);
            int s1;
            fread(&s1, sizeof(int), 1, F);
            int s2;
            fread(&s2, sizeof(int), 1, F);
 
      switch (ft)
    {
       case square:
       {  FSquare *f= new FSquare(x0,y0,col,siz);
            add_to(T,f);
          break;
       }
       case rectangle:
       {  FRectangle *f = new FRectangle (x0,y0,col,siz,s1,s2);
            add_to(T,f);
          break;
       }
       case fellipse:
       {
          FEllipse *f = new FEllipse(x0,y0,col,siz, s1, s2);
            add_to(T,f);
          break;
       }
      default:
       {
        FRhombus *f = new FRhombus(x0,y0,col,siz);
         add_to(T,f);
       }
      }
    }
         paint_l(T);
       fclose(F);
   };

может это быдло код можно как то переписать?
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 06:03     Запись класса в файл #11
за раз
C++
1
fwrite(&tmp->fi, sizeof(Figure),1, F) ;
читать аналогично
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:24  [ТС]     Запись класса в файл #12
@AntonChik, а как тогда мне вызвать конструктор і-й фигуры которую я читаю с файла?
фигуры у меня создаются так :
Кликните здесь для просмотра всего текста
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
      switch (ft) // тип фигруры
      {
       case square:
       {  FSquare *f= new FSquare(x0,y0,col,siz);
            add_to(T,f);
          break;
       }
       case rectangle:
       {  FRectangle *f = new FRectangle (x0,y0,col,siz,s1,s2);
            add_to(T,f);
          break;
       }
       case fellipse:
       {
          FEllipse *f = new FEllipse(x0,y0,col,siz, s1, s2);
            add_to(T,f);
          break;
       }
      default:
       {
        FRhombus *f = new FRhombus(x0,y0,col,siz);
         add_to(T,f);
       }
      }
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 13:35     Запись класса в файл #13
полагаю так:
C++
1
2
3
4
Figure tmpf;
fread(&tmpf,sizeof(Figure),1,F);
int x0= tmpf->getX();
//... и т.д.
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:42  [ТС]     Запись класса в файл #14
Цитата Сообщение от henecs Посмотреть сообщение
Figure(){};
* * * * ~Figure(){};
* * * * virtual void paint()=0;
но если я правильно понял то не можно создавать объекты класса в котором есть чисто виртуальная функция .... или можно ? (я в тупике..)
AntonChik
1083 / 581 / 21
Регистрация: 11.11.2008
Сообщений: 1,544
28.06.2013, 13:49     Запись класса в файл #15
а, вон про что разговор, я как-то просмотрел.
можно сделать какой-нибудь отдельный производный класс с полным джентльменским набором, именно для этих целей.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2013, 13:59     Запись класса в файл
Еще ссылки по теме:

C++ Запись экземпляра класса в файл
C++ Не работает метод класса (запись и чтение в файл)
C++ Разбиение метода класса на файл реализации и файл заголовка

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

Или воспользуйтесь поиском по форуму:
henecs
 Аватар для henecs
16 / 16 / 0
Регистрация: 19.05.2013
Сообщений: 135
28.06.2013, 13:59  [ТС]     Запись класса в файл #16
@AntonChik, хмм... как вариант, спасибо за помощь
Yandex
Объявления
28.06.2013, 13:59     Запись класса в файл
Ответ Создать тему
Опции темы

Текущее время: 06:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru