Вы находитесь на странице: 1из 5

Задание 4

Тема: классы, конструкторы, деструктор, перегрузка операторов,


дружественные функции

Реализовать шаблонный класс Buffer. Буфер хранит элементы


некоторого типа. При заполнении всего буфера, и попытке
добавить еще элементы память выделяется с некоторым запасом.
Т.е., пусть у вас был буфер с capacity 10 и в нем уже
содержаться 10 элементов. При попытке добавить еще один
элемент, должна быть выделена новая память, но не под 11
элементов, а, например, под 15. При сложении двух буферов с
числом элементов 10 и 20, память выделяется не под 30
элементов, а под, например, 40 и т.д.

size - число элементов в буфере;


capacity - максимальное число элементов, которые могут быть
сохранены в буфере. При size == capacity при добавлении нового
элемента в буфер происходит выделение памяти под большее число
элементов;
buffer - указатель на область в памяти, где хранятся элементы
буфера;
Resize(int AddCapacity) - увеличивает capacity текущего буфера
на величину AddCapacity. size и данные, хранящиеся в буфере
при этом не меняются.

template <typename T>


class Buffer
{
private:
unsigned int size;
unsigned int capacity;
T* buffer;
void Resize(unsigned int AddCapacity);
public:
Buffer();
Buffer(unsigned int Capacity);
Buffer(const Buffer& Other);
Buffer(Buffer&& Other);
~Buffer();

Buffer& operator=(const Buffer& Other);


Buffer& operator=(Buffer&& Other);

//...
};

I
Реализовать приведенные конструкторы, деструктор, операторы
присваивания и метод Resize.
Конструктор Buffer(int Capacity) создает буфер с емкостью
Capacity, конструктор по умолчанию создает буфер с некоторой
заданной емкостью (определяется вами).
Конструкторы, деструктор и операторы присваивания должны
содержать отладочную печать со своим названием.

II
Реализовать константные методы получения текущего числа
элементов в буфере Size(), его максимальной емкости
Capacity(), значения первого элемента First() и последнего –
Last().
III
Реализовать метод Delete(unsigned int Idx), удаляющий элемент
по заданному индексу Idx. Нумерация элементов в буфере
начинается с нуля.
Например, если ваш буфер содержал следующие данные:
{1, 2, 3, 4, 5, 6, 7, 8, 9}

То после удаления элемента с индексом 3, буфер содержимое


буфера будет:
{1, 2, 3, 5, 6, 7, 8, 9}

IV
Осуществить перегрузку операторов +, +=, <<, [] и записи в
поток вывода (<<).

Оператор +
Тип возвращаемого значения: Buffer<T>
1) Сложение двух буферов. Результат - новый буфер, сами
слагаемые не изменяются.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
Buffer<int> buff2 = ...; // {6, 7, 8, 9, 10}
...
Buffer<int> buff3 = buff1 + buff2; // {1,2,3,4,5,6,7,8,9,10}
2) Сложения буфера и элемента типа T. Результат - новый буфер,
в конец которого добавлен элемент. Сами слагаемые не
изменяются.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
Buffer<int> buff2 = buff1 + 10; // {1,2,3,4,5,10}
3) Сложение элемента типа Т и буфера. Результат - новый буфер,
в начало которого добавлен элемент. Остальные элементы буфера
сдвинуты на одну позицию. Сами слагаемые не изменяются.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
Buffer<int> buff2 = 10 + buff1; // {10,1,2,3,4,5}

Оператор +=
Тип возвращаемого значения: Buffer<T>&
1) Добавление элемента типа Т в конец текущего буфера.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
buff1 += 10; // {1, 2, 3, 4, 5, 10}
2) Добавление буфера в конец текущего.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
Buffer<int> buff2 = ...; // {6, 7, 8, 9, 10}
buff1 += buff2; //buff1 = {1,2,3,4,5,6,7,8,9,10}

Подсказка: для изменения размера буфера можно вызвать


реализованный ранее private метод Resize.

Оператор <<
Тип возвращаемого значения: void
1) Добавление элемента типа Т в конец текущего буфера.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
buff1 << 10; // {1, 2, 3, 4, 5, 10}
2) Добавление буфера в конец текущего.
Buffer<int> buff1 = ...; // {1, 2, 3, 4, 5}
Buffer<int> buff2 = ...; // {6, 7, 8, 9, 10}
buff1 << buff2; //buff1 = {1,2,3,4,5,6,7,8,9,10}
Подсказка: для изменения размера буфера можно вызвать
реализованный ранее private метод Resize.

Оператор []
Получение и изменение значения элемента по индексу.
Следующие конструкции должны работать:
Buffer<Type> buff;
...
Type val = buff[3];
buff[5] = val2;

Оператор записи в поток <<


Осуществляет вывод содержимого буфера на экран. Данный
оператор должен быть реализован как глобальная функция.
Реализация на основе дружественной функции (friend) не
допускается.
Следующий код должен работать:
Buffer<int> buff; //buff = {1, 2, 3, 4, 5}
std::cout << buff << std::endl;
Результат:
{ 1, 2, 3, 4, 5 }

V
Код вашей программы также должен содержать вызов всех
реализованных public методов и функций.
Объявление класса и функций поместить в заголовочный файл
Buffer.h, реализацию - в Buffer.hpp.
В файл исходного кода, содержащий функцию main() вашей
программы необходимо подключить Buffer.hpp.

Оценить