Записать в массив неограниченного числа объектов - 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.