Скачиваний:
40
Добавлен:
05.07.2021
Размер:
27.69 Кб
Скачать
source1.cpp







#include "transaction.h"


#include <vector>
#include <fstream>
#include <Windows.h>

using namespace std;

namespace menu
{
	template <class T>
	T transactMenu(T*);
};

class Order; //класс который содержит инфу о скачиваниях
class Shop; //класс который предоставляет возможность приобрести лицензию на программу котору можно скачать 
class Customer; //класс который содержит в себе инфу о пользователях
class Goods; //класс который содержит в себе инфу о всехвозможных пргаммах которые можно скачать
class MyException; //класс иключения

void spaceDestroyer(string&);
void pointDestroyer(string&);
void fread(vector<Customer>&);
void fwrite(vector<Customer>);

class MyException : public std::exception
{

private:
	string error;
public:
	MyException(string error)
	{
		this->error = error;
	}
	string what()
	{
		return this->error;
	}
};


class Goods
{

private:
	friend class Shop;
	int* error;
public:
	unsigned int count;
	string name;
	double price;
	Goods(int count)
	{
		try
		{
			int count = 0;
			while (true)
			{
				cout << count << endl;
				count++;
				error = new int[100000000];
			}
		}
		catch (bad_alloc exeption) {
			cout << "Ошибка выделения:" << exeption.what() << endl;
			system("pause");
			return;
		}
	}
	Goods(const Goods& goods, int count)
	{
		this->name = goods.name;
		this->price = goods.price;
		this->count = count;
	}
	Goods()
	{
		cout << endl << "Объект \"Программа\" создан" << endl;
	}
	void output()
	{
		cout << "  " << setw(23) << name;
		cout << "  ||  " << setw(8) << price;
		cout << "  ||  " << count << endl;
	}
	void input()
	{
		while (true)
		{
			cout << "Наименование программы : ";
			cin >> name;
			try {
				cout << "Цена за скачивание лицензии: ";
				cin >> price;
				cout << "Кол-во преобретающих лицензий этой программы: ";
				cin >> count;
				break;
			}
			catch (exception error)
			{
				cin.clear();
				cin.ignore(32767, '\n');
				cout << error.what() << endl;
				system("pause");
			}
		}

	}
	void set(Goods goods)
	{

		this->name = goods.name;
		this->count = goods.count;
		this->price = goods.price;
	}
};

class Order
{
public:
	friend class Customer;
	int key;
	vector<Goods> order;

	double getTotalPrice()
	{
		double totalPrice = 0;
		for (int i = 0; i < order.size(); i++)
		{
			totalPrice += (order.at(i).price * order.at(i).count);
		}
		return totalPrice;
	}
	int getTotalCount()
	{
		int totalCount = 0;
		for (int i = 0; i < order.size(); i++)
		{
			totalCount += order.at(i).count;
		}
		return totalCount;
	}
	Order() { this->key = 0; }
	~Order() { }
	void output()
	{
		cout << "   " << setw(25) << "Наименование программы";
		cout << "  Цена за лицензию    ";
		cout << " Кол-во" << endl;
		double totalPrice = 0;
		for (int i = 0; i < order.size(); i++)
		{
			order.at(i).output();
			totalPrice += (order.at(i).price * order.at(i).price);
		}
		cout << "Стоимость : " << getTotalPrice() << endl;
	}
	void fread(ifstream& file)
	{
		file >> key;
		cout << key;
		while (true)
		{
			Goods goods;
			file >> goods.name;
			pointDestroyer(goods.name);
			file >> goods.price;
			file >> goods.count;
			order.push_back(goods);

			if (file.eof() || file.get() == '\n') return;
		}
	}
	void fwrite(ofstream& file)
	{
		file << key;
		for (int i = 0; i < order.size(); i++)
		{

			spaceDestroyer(order.at(i).name);
			file << " " << order.at(i).name;
			pointDestroyer(order.at(i).name);

			file << " " << order.at(i).price;
			file << " " << order.at(i).count;
		}
	}
};

class Customer
{
public:
	string name;
	double amountOfMoney;
	vector<Order> orders;
	static void headOfTable()
	{
		cout << "   " << setiosflags(ios::left) << setw(25) << "Имя";
		cout << "Баланс";
		cout << "     Кол-во скачиваний" << endl;
	}
	void fread(ifstream& file)
	{
		file >> name;
		pointDestroyer(name);
		file >> amountOfMoney;
		int i = 0;
		while (!file.eof())
		{
			Order newOrder;
			newOrder.fread(file);
			orders.push_back(newOrder);
		}

	}
	Customer(const Customer& customer)
	{
		this->name = customer.name;
		this->amountOfMoney = customer.amountOfMoney;
		this->orders = customer.orders;
	}
	Customer()
	{
		cout << endl << "Объект \"Пользователь\" создан" << endl;
		system("pause");
	}
	~Customer()
	{
		cout << endl << "Объект \"Пользователь\" удален" << endl;
		system("pause");
	}
	void fwrite(int i)
	{
		string iFileName = "customer";
		iFileName += (i + '0');
		iFileName += ".txt";
		ofstream file(iFileName);

		spaceDestroyer(name);
		file << endl << name;
		pointDestroyer(name);

		file << endl << amountOfMoney;
		if (orders.size()) file << endl;
		for (int i = 0; i < orders.size(); i++)
		{
			orders.at(i).fwrite(file);
			if (orders.size() - i > 1) file << endl;
		}
		file.close();
	}
	void input()
	{
		cout << "Имя Пользователя : ";
		cin >> name;
		try {
			cout << "Баланс : ";
			cin >> amountOfMoney;
		}
		catch (exception error)
		{
			cin.clear();
			cin.ignore(32767, '\n');
			cout << error.what() << endl;
			system("pause");
		}
	}
	void output()
	{
		cout << "  " << setw(23) << name;
		cout << " || " << setw(17) << amountOfMoney;
		cout << " || " << orders.size() << endl;
	}
	void set(Customer customer)
	{

		this->name = customer.name;
		this->amountOfMoney = customer.amountOfMoney;
		this->orders = customer.orders;
	}
};

class Shop
{
	bool fread()
	{
		bool status;
		ifstream file("PO.txt");
		if (file.get() != EOF)
		{
			file >> name;
			pointDestroyer(name);
			int i = 0;
			while (!file.eof())
			{
				Goods goods;
				file >> goods.count;
				file >> goods.name;
				pointDestroyer(goods.name);
				file >> goods.price;
				products.push_back(goods);

			}
			status = true;
		}
		else status = false;
		file.close();
		return status;
	}
public:
	string name;
	vector<Goods> products;

	void deleteFromOrder(Order& order)
	{

		order.output();

		string goodsName;
		cout << "Наименование ПО : ";
		cin >> goodsName;
		for (int i = 0; i < order.order.size(); i++)
		{
			if (goodsName == order.order.at(i).name)
			{
				for (int j = 0; j < products.size(); j++)
				{
					if (products.at(j).name == order.order.at(i).name)
					{
						products.at(i).count += order.order.at(i).count;
					}
				}
				order.order.erase(i + order.order.begin());
				cout << "ПО " << goodsName << " удален " << endl;
				system("pause");
				return;
			}
		}
		cout << "Неверный ввод" << endl;
		system("pause");

	}
	void addToOrder(Order& order)
	{
		system("cls");
		if (!products.size())
		{
			cout << "Каталог пуст" << endl;
			system("pause");
			return;
		}
		cout << "   " << setw(25) << "";
		for (int i = 0; i < products.size(); i++)
		{
			products.at(i).output();
		}

		string name;

		cout << "Наименование ПО : ";
		cin >> name;
		system("cls");
		bool status = false;
		for (int i = 0; i < products.size(); i++)
		{
			if (name == products.at(i).name && products.at(i).count)
			{

				products.at(i).output();
				unsigned int count;
				try {

					cout << "Кол-во : ";
					cin >> count;
				}
				catch (exception error)
				{
					cin.clear();
					cin.ignore(32767, '\n');
					cout << error.what() << endl;
					system("pause");
				}

				status = true;
				if (products.at(i).count >= count)
				{
					Goods goods(products.at(i), count);

					products.at(i).count -= count;
					bool orderStatus = false;
					for (int j = 0; i < order.order.size(); i++)
					{
						if (order.order.at(i).name == goods.name)
						{
							order.order.at(i).count += goods.count;
							orderStatus = true;
						}
					}
					if (!orderStatus)
					{
						order.order.push_back(goods);
					}
				}


			}
		}
		if (!status)
		{
			cout << "Данная лицензия на ПО отсутствует" << endl;
			system("pause");
		}
		return;
	}


	void searchOrder(Order& order)
	{
		system("cls");
		if (!products.size())
		{
			cout << "Каталог пуст" << endl;
			system("pause");
			return;
		}
		string name;

		cout << "Наименование ПО : ";
		cin >> name;
		system("cls");
		bool status = false;
		for (int i = 0; i < products.size(); i++)
		{
			if (name == products.at(i).name && products.at(i).count)
			{

				products.at(i).output();
				status = true;
				system("pause");
			}

		}
		if (!status)
		{
			cout << "Данная лицензия на ПО отсутствует" << endl;
			system("pause");
		}
		return;
	}



	Shop()
	{
		cout << endl << "Объект \"сайт скачиваний\" создан" << endl;
		if (!fread()) input();
		else cout << "Данные считаны из файла" << endl;
		system("pause");
	}
	~Shop()
	{
		cout << endl << "Объект \"сайт скачиваний\" удален" << endl;
		fwrite();
		system("pause");
	}
	void fwrite()
	{
		ofstream file("PO.txt");

		spaceDestroyer(name);
		file << endl << name;
		pointDestroyer(name);

		for (int i = 0; i < products.size(); i++)
		{

			file << endl << products.at(i).count;

			spaceDestroyer(products.at(i).name);
			file << endl << products.at(i).name;
			pointDestroyer(products.at(i).name);

			file << endl << products.at(i).price;
		}
		file.close();
	}
	void input()
	{
		cout << "Наименование сайта скачиваний : ";
		cin >> name;
		fwrite();
	}
	void inputGoods()
	{
		system("cls");
		string name;
		cout << "Наименование программы : ";
		cin >> name;
		for (int i = 0; i < products.size(); i++)
		{
			if (name == products.at(i).name)
			{
				cout << "   " << setw(25) << "Наименование программы";
				cout << "  Цена    ";
				cout << " Кол-во" << endl;
				products.at(i).output();
				try {
					cout << "Добавить лицензию : ";
					unsigned int count;
					cin >> count;
					products.at(i).count += count;
					return;
				}
				catch (exception error)
				{
					cin.clear();
					cin.ignore(32767, '\n');
					cout << error.what() << endl;
					system("pause");
				}
			}
		}
		Goods goods;
		goods.name = name;

		try
		{
			cout << "Цена : ";
			cin >> goods.price;
			cout << "Кол-во : ";
			cin >> goods.count;
			products.push_back(goods);
		}
		catch (exception error)
		{
			cin.clear();
			cin.ignore(32767, '\n');
			cout << error.what() << endl;
			system("pause");
		}
	}

	void deleteGoods()
	{
		system("cls");
		if (!products.size())
		{
			cout << "Каталог пуст" << endl;
			system("pause");
			return;
		}
		cout << "   " << setw(25) << "Наименование ПО";
		cout << "  Цена    ";
		cout << " Кол-во доступных лицензий" << endl;
		for (int i = 0; i < products.size(); i++)
		{
			products.at(i).output();
		}
		string name;
		cout << "Наименование ПО : ";
		cin >> name;
		bool status = false;
		for (int i = 0; i < products.size(); i++)
		{
			if (name == products.at(i).name)
			{
				products.erase(i + products.begin());
				status = true;
			}
		}
		if (!status)
		{
			cout << "Данный ПО отсутствует" << endl;
			system("pause");
			return;
		}
	}
	void changeGoods()
	{
		system("cls");
		if (!products.size())
		{
			cout << "Каталог пуст" << endl;
			system("pause");
			return;
		}
		cout << "   " << setw(25) << "Наименование ПО";
		cout << "  Цена    ";
		cout << " Кол-во доступных лицензий" << endl;
		for (int i = 0; i < products.size(); i++)
		{
			products.at(i).output();
		}
		string name;
		cout << "Наименование ПО : ";
		cin >> name;
		bool status = false;
		for (int i = 0; i < products.size(); i++)
		{
			if (name == products.at(i).name)
			{
				products.at(i) = menu::transactMenu<Goods>(&products.at(i));
				status = true;
			}
		}
		if (!status)
		{
			cout << "эта лицензия отсутствует" << endl;
			system("pause");
			return;
		}
	}
};


void spaceDestroyer(string& str)
{
	for (int i = 0; i < str.size(); i++)
	{
		if (str.at(i) == ' ') str.at(i) = '.';
	}
}
void pointDestroyer(string& str)
{
	for (int i = 0; i < str.size(); i++)
	{
		if (str.at(i) == '.') str.at(i) = ' ';
	}
}
void fread(vector<Customer>& customers)
{
	const string fileName = "customer";
	int i = 0;
	while (true)
	{
		string iFileName = fileName;
		string str;
		iFileName += (i + '0');
		iFileName += ".txt";
		ifstream file;

		i++;
		try {

			file.open(iFileName);
			if (!file.is_open())
			{
				string errorText = "Ошибка чтения\nФайл ";
				errorText += iFileName;
				errorText += " не доступен";
				throw MyException(errorText);
			}
			Customer newCustomer;
			newCustomer.fread(file);
			customers.push_back(newCustomer);

			file.close();


		}
		catch (MyException& exception) {
			cout << exception.what() << endl;
			system("pause");
			break;
		}
	}
}


void fwrite(vector<Customer> customers)
{
	for (int i = 0; i < customers.size(); i++)
	{
		customers.at(i).fwrite(i);
	}
}
void badAllocExit()
{
	cout << "Собственная функция завершения" << endl;
	exit(1);
}

namespace menu
{
	template <class T>
	T transactMenu(T* object)
	{
		try {
			Transaction<T> transaction(object);
			T* newObject = new T;

			while (true)
			{
				system("cls");
				cout << "1. Начать транзакцию" << endl;
				cout << "2. Откатить состаяние" << endl;
				cout << "3. Просмотреть состояние транзакции" << endl;
				cout << "4. Подтвердить транзакцию // Выйти" << endl;
				cout << ">> ";
				try {
					int choice;
					cin >> choice;
					switch (choice)
					{
					case 1:
					{

						newObject->input();
						transaction.BeginTransactions(newObject);
						break;
					}
					case 2:
					{
						transaction.DeleteTransactions();
						break;
					}
					case 3:
					{
						system("cls");

						transaction.show();
						system("pause");
						break;
					}
					case 4:
					{

						object = transaction.currentState;
						transaction.commit();
						system("cls");
						transaction.show();

						transaction = NULL;
						object->output();
						system("pause");

						return *object;
					}
					default: cout << "Неверный ввод" << endl; system("pause"); break;
					}
				}
				catch (exception error)
				{
					cin.clear();
					cin.ignore(32767, '\n');
					cout << error.what() << endl;
					system("pause");
				}
			}
		}
		catch (const std::bad_alloc& error) {
			std::cout << "Ошибка выделения :" << error.what() << endl;
			system("pause");
		}
	}
	void orderMenu(Customer& me, Shop& shop)
	{
		Shop rollbackShop = shop;
		Customer rollbackCustomer = me;
		Order order;
		while (true)
		{
			system("cls");

			cout << "1. Добавить ПО к приобретению лицензии (добавить данные в файл)" << endl;
			cout << "2. Удалить ПО из покупок (удалить данные из файла)" << endl;
			cout << "3. Просмотреть текущие лицензии (считывание из файла)" << endl;
			cout << "4. Оплатить лицензии к ПО // Выйти" << endl;
			cout << "5. Отменить приобретение лицензии // Выйти" << endl;
			cout << ">> ";
			try {
				int choice;
				cin >> choice;
				switch (choice)
				{
				case 1:
				{
					shop.addToOrder(order);
					break;
				}
				case 2:
				{
					shop.deleteFromOrder(order);
					break;
				}
				case 3:
				{

					if (!order.order.size()) cout << " пусто" << endl;
					else order.output();
					system("pause");
					break;
				}
				case 4:
				{
					if (order.order.size() && me.amountOfMoney >= order.getTotalCount())
					{
						me.amountOfMoney -= order.getTotalCount();
						me.orders.push_back(order);
						return;
					}
					else
					{
						cout << "Недостаточно средств" << endl;
						system("pause");
						break;
					}
				}
				case 5:
				{
					me = rollbackCustomer;
					shop = rollbackShop;
					return;
				}
				default: { cout << "Неверный ввод" << endl; system("pause"); break; }
				}
			}
			catch (exception error)
			{
				cin.clear();
				cin.ignore(32767, '\n');
				cout << error.what() << endl;
				system("pause");
			}
		}
	}
	void shopMenu(Customer me, int iteration)
	{
		Shop shop;
		Order order;
		while (true)
		{
			system("cls");
			cout << "        " << shop.name << endl;
			cout << " меню пользователя" << endl;
			cout << "1. купить лицензии (добавить данные в файл) " << endl;
			cout << "2. Просмотр истории покупок лицензии (считывание данных из файла)" << endl;
			cout << "3. Изменить свои данные (радатирование данных в файле)" << endl;
			cout<<"4. Поиск программ (поиск по файлу)"<<endl;
			cout << "5. вернуться" << endl;
			cout << ">> ";
			try {
				int choice;
				cin >> choice;
				switch (choice)
				{
				case 1:
				{
					orderMenu(me, shop);
					shop.fwrite();
					me.fwrite(iteration);
					break;
				}
				case 2:
				{
					system("cls");

					if (!me.orders.size())
					{
						cout << "История приобреиений пуста" << endl;
						system("pause");
						break;
					}
					cout << "  Ключ    Кол-во лицензий    Сумма " << endl;
					for (int i = 0; i < me.orders.size(); i++)
					{
						cout << "  " << setw(5) << me.orders.at(i).key;
						cout << " ||  " << setw(17) << me.orders.at(i).getTotalCount();
						cout << " || " << me.orders.at(i).getTotalPrice() << endl;
					}
					system("pause");
				}
				case 3:
				{
					me = transactMenu<Customer>(&me);
					system("pause");
					me.fwrite(iteration);
					break;
				}
				case 4:
				{
					shop.searchOrder(order);
					break;
				}
				case 5: return;
				default: { cout << "Неверный ввод" << endl; system("pause"); break; }
				}
			}
			catch (exception error)
			{
				cin.clear();
				cin.ignore(32767, '\n');
				cout << error.what() << endl;
				system("pause");
			}

		}

	}
	void adminShopMenu(Customer& me, int iteration)
	{
		Shop shop;
		Order order;
		while (true)
		{
			system("cls");
			cout << "        " << shop.name << endl;
			cout << "РЕЖИМ АДМИНИСТРАТОРА" << endl;
			cout << "1)Скачать ПО на компьютер (добавить данные в файл)" << endl;
			cout << "2)Просмотр истории скачивания (считывание из файла)" << endl;
			cout << "3)Изменить свои данные (редактирование данных в файле)" << endl;
			cout << "4)Добавить программу для скачивания (добавить данные в файл)" << endl;
			cout << "5)Удалить программу для скачивания    (ADMIN ROOTS)" << endl;
			cout << "6)Изменить права для скачивания (редактирование данных в файле)" << endl;
			cout << "7)Поиск программ (поиск данных в файле)" << endl;
			cout << "8)Вернуться назад" << endl;
			cout << ">> ";
			try {
				int choice;
				cin >> choice;
				switch (choice)
				{
				case 1:
				{
					orderMenu(me, shop);
					shop.fwrite();
					me.fwrite(iteration);
					break;
				}
				case 2:
				{
					system("cls");

					if (!me.orders.size())
					{
						cout << "История скачиваний ПО пуста" << endl;
						system("pause");
						break;
					}
					cout << "  Ключ    Кол-во лицензий    Сумма " << endl;
					for (int i = 0; i < me.orders.size(); i++)
					{
						cout << "  " << setw(5) << me.orders.at(i).key;
						cout << " ||  " << setw(17) << me.orders.at(i).getTotalCount();
						cout << " || " << me.orders.at(i).getTotalPrice() << endl;
					}
					system("pause");
					break;
				}
				case 3:
				{
					me = transactMenu<Customer>(&me);
					system("pause");
					me.fwrite(iteration);
					break;
				}
				case 4:
				{
					shop.inputGoods();
					shop.fwrite();
					break;
				}
				case 5:
				{
					shop.deleteGoods();
					shop.fwrite();
					break;
				}
				case 6:
				{
					shop.changeGoods();
					shop.fwrite();
				}

				case 7: 
				{
					shop.searchOrder(order);
					break;
				}
				case 8: return;
				default: { cout << "Неверный ввод" << endl; system("pause"); break; }
				}
			}
			catch (exception error)
			{
				cin.clear();
				cin.ignore(32767, '\n');
				cout << error.what() << endl;
				system("pause");
			}
		}

	}
	void authMenu()
	{
		const string adminName = "Маргарита";

		vector<Customer> customers;
		fread(customers);

		while (true)
		{
			system("cls");
			cout << "1)Войти в свой аккаунт (считываем информацию из файла)" << endl;
			cout << "2)Зарегистрироваться (добавляем данные в файл)" << endl;
			cout << "3)Просмотр всех пользователей в системе скачивания ПО (читаем из файла)" << endl;
			cout << "4)Выход bad_alloc и конструктор" << endl; //указывает что ресурс не может быть выделен из-за нехватки доступной памяти
			cout << "5)Выход set_terminate" << endl;//Если программа не может найти подходящий обработчик для сгенерированной исключительной ситуации, то будет вызвана процедура завершения terminate() (ее также называют обработчиком завершения).
			cout << "6)Выход" << endl;
			cout <<"7)Опишите предназначение функции terminate() ?"<<endl;
			cout << ">> ";

			try {
				int choice;
				cin >> choice;

				switch (choice)
				{
					case 7:
					{
						cout << "Если программа не может найти подходящий обработчик для сгенерированной исключительной ситуации, то будет вызвана процедура завершения terminate() (ее также называют обработчиком завершения)." << endl;
						system("pause");
						break;

					}
				case 1:
				{
					system("cls");
					if (!customers.size())
					{
						cout << "Нет зарегестрированных пользователей" << endl;
						system("pause");
						break;
					}
					cout << " ВХОД" << endl;
					string authName;
					cout << "Ваше имя: ";
					cin >> authName;
					bool status = false;
					for (int i = 0; i < customers.size(); i++)
					{
						if (customers.at(i).name == authName)
						{
							if (authName == adminName) adminShopMenu(customers.at(i), i);
							else shopMenu(customers.at(i), i);
							status = true;
						}
					}
					if (!status)
					{
						cout << "Неверно введено имя" << endl;
						system("pause");
					}

					break;
				}
				case 2:
				{
					system("cls");
					cout << "Регистрация нового пользователя" << endl;
					Customer newCustomer;
					newCustomer.input();
					newCustomer.fwrite(customers.size());
					customers.push_back(newCustomer);

					break;
				}
				case 3:
				{
					system("cls");
					if (customers.empty())
					{
						cout << "Нет зарегестрированных пользователей" << endl;
						system("pause");
						break;
					}

					Customer::headOfTable();
					for (int i = 0; i < customers.size(); i++)
					{
						customers.at(i).output();
					}

					system("pause");
					break;
				}
				case 4:
				{

					fwrite(customers);
					Goods goods(0);
					return;

				}
				case 5:
				{
					fwrite(customers);
					set_terminate(badAllocExit);
					try
					{
						throw "Этот текст не будет в консоли";
					}
					catch (int)
					{
						cout << "И этот текст не будет в консоли";
					}
				}
				case 6: fwrite(customers); return;
				default: { cout << "Неверный ввод" << endl; system("pause"); break; }
				}
			}
			catch (exception error)
			{
				cin.clear();
				cin.ignore(32767, '\n');
				cout << error.what() << endl;
				system("pause");
			}
		}

	}
};

int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	cin.exceptions(ios_base::failbit);

	menu::authMenu();
}



























transaction.h

#pragma once
#include <iostream>
#include <iomanip>


using namespace std;


template <class T>
class Transaction
{
public:

	T* prevState;
	T* currentState;

	Transaction(T* doc) {

		prevState = NULL;
		currentState = new T;
		currentState = doc;

	}

	~Transaction() { delete currentState; if (prevState) delete prevState; }

	void show()
	{

		cout << "состояния объекта" << endl;
		if (prevState)
		{
			cout << "prevState = " << endl;
			prevState->output();
			cout << endl;
			cout << "currentState = " << endl;
			currentState->output();
			cout << endl;
		}
		else
		{
			cout << "prevState = NULL" << endl;
			cout << "currentState = " << endl;
			currentState->output();
			cout << endl;
		}
	}

	bool BeginTransactions(T* newState)
	{
		delete prevState;
		prevState = currentState;
		currentState = new T(*prevState);
		if (!currentState) return 0;
		currentState->set(*newState);
		return 1;

	}

	void commit()
	{
		prevState = NULL;
	}

	void DeleteTransactions()
	{
		if (prevState != NULL) {
			currentState = NULL;
			delete currentState;
			currentState = prevState;
			prevState = NULL;

		}

	}

	T* operator->() { return currentState; };
};





Соседние файлы в папке лабы Салапура 2ая часть (4 семестр)