Записать в массив неограниченного числа объектов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

вопщем в етой задачке мне нужно чтоб можно было неограниченое число объектов в динамический масив объектов записивать, и потом все выводит из него помогите исправиль ошыбку связаную с указателями...
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <time.h>
int GLi=0;
 
class lab
  {
 protected:
  char nazvaPr[20],opSys[10];
  float rozmir;
  time_t time_;
 public:
lab(char *_nazva="",char *_opSys="",float _rozmir=0,time_t _time_=time(NULL))
       {
       sprintf(nazvaPr,"%s",_nazva);
       sprintf(opSys,"%s",_opSys);
    rozmir=_rozmir;
    time_=_time_;
       }
    int Lvvod();
    int print();
 
      char *ret_nazva(){ return nazvaPr;}
      char *ret_op(){ return opSys;}
      float ret_rozmir(){ return rozmir;}
      time_t ret_time(){ return time_;}
   ~lab(){    delete this;     }
  };
 
//----------C-                  c  ----------
lab::Lvvod()
  {
clrscr();
   cout<<"vvedit nazvy programi: ";
     cin>>nazvaPr;
clrscr();
   cout<<"vvedit operaciyna sistema programi: ";
     cin>>opSys;
clrscr();
   cout<<"vvedit pozmir programi: ";
     cin>>rozmir;
clrscr();
return 0;
  }
//----------C-                  c  ----------
lab::print()
  {
   cout<<'\n'<<nazvaPr;
     cout<<'\n'<<opSys;
       cout<<'\n'<<rozmir;
     cout<<'\n'<<ctime(&time_);
   return 0;
  }

//--------------------------------------------------------------------------
 
class baseD
  {
  private:
   lab *base[2];
  public:
    int dodat();
    int print();
  };
 
//----------C-                  c  ----------
baseD::dodat()
  {
lab *tmpBD=new lab[GLi];
 for(int i=0;i<GLi;i++)
   tmpBD[i]=base[i];                //     [COLOR="Red"]  тут ерор[/COLOR]
 
  GLi++;
  *base=new lab[GLi];
     base[GLi-1]->Lvvod();
 
  for(i=0;i<GLi;i++)
    base[i]=tmpBD[i];             //        [COLOR="Red"]тут ерор[/COLOR]
 return 0;
  }

//----------C-                  c  ----------
baseD::print()
  {
  for(int i=0;i<GLi;i++)
      base[i]->print();
 return 0;
  }

//----------------------------------------main----------------------------
 
int main(void){
clrscr();
int n=3;
baseD base;
 
for(int i=0;i<n;i++)
 base.dodat();
 base.print();
 
return 0;
}

Решение задачи: «Записать в массив неограниченного числа объектов»

textual
Листинг программы
class baseD
{
 private:
   lab *base;   // зачем сдесь был массив указателей?
 public:
   int dodat();
   int print();
};
 
//----------C-                  c  ----------
baseD::dodat()
{
   if (GLi == 0)
   {
      base = new lab[GLi];
      base[Gli-1]->Lvvod;
      GLi++;
   }
   else
   {
      lab *tmpBD = new lab[GLi];
      for(int i = 0; i < GLi; i++)
         tmpBD[i] = base[i];                
      GLi++;
      delete [] base; // перед новым выделением памяти, старую надо освободить.
      base = new lab[GLi];
      base[GLi-1] -> Lvvod();
      for(int i = 0; i < GLi; i++)
         base[i] = tmpBD[i];
   }             
}

Объяснение кода листинга программы

В представленном коде определен класс baseD, который содержит приватный массив указателей lab и два публичных метода dodat() и print(). Метод dodat() отвечает за динамическое выделение памяти под массив объектов lab. Если GLi равно нулю, то создается новый массив из одного элемента, иначе создается новый массив из GLi элементов, и в него копируются все элементы старого массива. Затем, освобождается память, выделенная под старый массив, и указатель base перенаправляется на новый массив. Метод print() выводит на экран содержимое массива объектов lab. В основной программе вызывается метод dodat() класса baseD.

Оцени полезность:

5   голосов , оценка 3.2 из 5
Похожие ответы