Шаг 107 - Второй способ функционального замыкания

Предыдущий способ хороший, но он исключает конструктор по умолчанию. Это значит, что данный класс может быть членом другого класса только как динамический объект. Нечего страшного нет, но все таки во первых придется следить за распределением памяти. Но кроме того пока объект есть заняты и ресурсы. Нужно использовать ресурс нужно создавать объект, ненужно использовать ресурс нужно удалять объект. Второй способ заключается в использовании чисто виртуальной функции. Смотрите как изменить описание класса.

class CComPort  
{
public:
	virtual void Operations(); 	// для работы с портом
	void OpenPort(LPCTSTR PortName,DWORD dwDesiredAccess,
		DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
		DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,
		HANDLE hTemplateFile);	
	CComPort();
	virtual ~CComPort();
private:
	HANDLE ComPort; 	
};

По вызову функции и передачи необходимых параметров будет вызвана виртуальная функция Operations внутри которой можно писать код для работы с портом. После выполнения вашего кода автоматически будет порт закрыт. Вообщем не плохо.

CComPort::CComPort()
{

}

CComPort::~CComPort()
{

}

void CComPort::OpenPort(LPCTSTR PortName,DWORD dwDesiredAccess,
	DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
	DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,
	HANDLE hTemplateFile)
{
	ComPort=CreateFile(PortName,dwDesiredAccess,
		dwShareMode,lpSecurityAttributes, dwCreationDisposition,
		dwFlagsAndAttributes,hTemplateFile);	
	if(ComPort==INVALID_HANDLE_VALUE)
		throw CString("Error Open");
	Operations();
	CloseHandle(ComPort);
}

void CComPort::Operations()
{

}

Самое тут главное в том, что объект класса может существовать до сколько угодно. В любой момент мы можем вызывать функцию работы для активизации работы с портом. По выполнению порт будет закрыт. Ну и использование подобного класса упрощается.

#include "stdafx.h"
#include "ComPort.h"
#include "iostream.h"

class CMyCom : public CComPort
{
public:
	void Operations();
};



void CMyCom::Operations()
{
}

void main()
{
	try
	{
		CMyCom cm;
		cm.OpenPort("LPT1",GENERIC_READ|GENERIC_WRITE,0,
			NULL,OPEN_EXISTING,0,NULL);
	}
	catch(...)
	{
		cout << "Error" << endl;
		return;
	}
}

Теперь без разницы динамический класс или статический, теперь не обязательно использовать исключения а можно возвращать результат операции через функцию, теперь функцию можно вызывать многократно и так далее.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.07.2001