Записать в массив неограниченного числа объектов - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д