Вот я написал лабу, но тут выделение памяти происходит статически (я комменты для динамики в коде подписал): | Код | #include <iostream> using namespace std;
const int SIZE = 5;
struct Item{ int key; int busy; char info[80]; Item(){ key = 0; busy = 0; *info = '\0'; } };
istream& operator >> (istream& , Item& n);
class Table{ private: int n;//кол-во добавленных элементов Item tab[SIZE];
public: friend ostream& operator << (ostream &s, const Table& t); //вывод таблицы int operator () (int key) const; //поиск элемента по ключу Table& operator += (const Item& t); //добавление элемента в таблицу Table& operator -= (int key); //удаление элемента int garbage(); //чистка таблицы от "удаленных элементов" const char * operator [] (int key) const; //выборка информации из таблицы по заданному ключу //пустой конструктор Table(){ n = 0; } //конструктор с заданным кол-вом элементов из массива ключей и информации Table(int k, const Item items[]){ n = 0; for(int i=0;i<k;i++){ (*this) += items[i]; } }
/*Это я уже добавил для динамики */ //копирующий конструктор, но тут бред, не пойму как правильно Table(const Table &t){ Item newItem[] = new Item[n]; for(int i=0;i<t.n;i++){ t.tab[i] >> newItem[i]; } Table newTab = new Table(n, newItem); } //не знаю как удалить память, выделенную для класса и структур ~Table(){ } };
//удаление элемента из таблицы, в динамике нужно память освободить, а не просто 0 поставить Table& Table::operator -= (int key){ int k = (*this)(key); if(k >= 0){ tab[k].busy = 0; } else { throw "Элемент не найден"; } return *this; }
//выборка информации из таблицы по заданному ключу const char * Table::operator [] (int key) const { int k = (*this)(key); if(k < 0){ return NULL; } else { return tab[k].info; } }
//чистка таблицы, в динамике тут нужно ещё и память освобождать int Table::garbage(){ int i, cur = n; n = 0; for(i=0;i<cur;i++){ if(tab[i].busy){ if(i != n){ //элемент должен быть перемещён tab[n] = tab[i]; //перемещаем } n++; } } return n == SIZE ? -1 : 0; // нет места }
//вывод элемента таблицы в выходной поток ostream& operator << (ostream &s, const Item &t){ if(t.busy){ return s << "Key: " << t.key << ";" << '\t' << "Info: " << t.info << endl; } }
//вывод таблицы в выходной поток ostream& operator << (ostream &s, const Table &t){ for(int i=0;i<t.n;i++){ if(t.tab[i].busy) { s << t.tab[i]; } } return s; }
//поиск элемента по ключу int Table::operator () (int key) const { for(int i=0;i<n;i++){ if(tab[i].key == key && tab[i].busy == 1){ return i; } } return -1; }
//добавление элемента в таблицу Table& Table::operator += (const Item& t){ int k = (*this)(t.key); if(k >= 0){ throw "Элемент с таким ключем уже есть в таблице"; } else { int g = garbage(); if(g < 0){ throw "В таблице нет свободного места"; //такого быть не должно,элемент должен всегда добавляться } else { tab[n].key = t.key; tab[n].busy = 1; strcpy(tab[n].info, t.info); n++; } } return *this; }
Table t;
/* тут код диалоговой программки для работы с классом */
|
Помогите пожалуйста
|