Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы / var09 my / 07nm

.cpp
Скачиваний:
24
Добавлен:
30.04.2013
Размер:
4.32 Кб
Скачать
#include <stdio.h>
#include <conio.h>
#include <math.h>

class CBaseObject
{
public:
	CBaseObject(void) { m_pPrev = NULL; m_pNext = NULL; data = 0; }
	CBaseObject(void *a) { m_pPrev = NULL; m_pNext = NULL; data = a; }
	CBaseObject(CBaseObject &src) { m_pPrev = NULL; m_pNext = NULL; data = src.data; }
	~CBaseObject(void) { m_pPrev = NULL; m_pNext = NULL; data = 0; }

	void *GetData(void) { return data; }
	void SetData(void *a) { data = a; }

	inline CBaseObject operator=(const CBaseObject &a) { data = a.data; return data; }

	void *data;

	CBaseObject *m_pPrev;
	CBaseObject *m_pNext;
};

class CDerivedObject : public CBaseObject
{
public:
	CDerivedObject(void):CBaseObject() { data = k; }
	CDerivedObject(float value[3]) { m_pPrev = NULL; m_pNext = NULL; data = k; }
	CDerivedObject(float k1, float k2, float k3) { m_pPrev = NULL; m_pNext = NULL; k[0]=k1; k[1]=k2; k[2]=k3; }
	CDerivedObject(CDerivedObject &src) { m_pPrev = NULL; m_pNext = NULL; data = src.data; }
	~CDerivedObject(void) { m_pPrev = NULL; m_pNext = NULL; data = 0; }

	float *GetData(void) { return k; }
	float GetK1(void) { return k[0]; }
	float GetK2(void) { return k[1]; }
	float GetK3(void) { return k[2]; }

	void SetData(float k1, float k2, float k3) { k[0]=k1; k[1]=k2; k[2]=k3; }

	inline CDerivedObject operator=(const CDerivedObject &a) { k[0]=a.k[0]; k[1]=a.k[1]; k[2]=a.k[2]; return k; }

private:
	float k[3];
};

class ObjectManager
{
public:
	ObjectManager() { m_pFirstObject = NULL; }
	~ObjectManager() { RemoveAllObjects(); };

	void AddObject(CBaseObject *pObject);
	void RemoveObject(CBaseObject *pObject);
	void RemoveAllObjects(void);
	void PrintObjects(void);
	CBaseObject *FindObjectByValue(float k1, float k2, float k3);

private:
	CBaseObject *m_pFirstObject;
};

void ObjectManager::AddObject(CBaseObject *pObject)
{
	if (pObject)
	{
//		printf("ObjectManager: adding object: %f %f %f\n", pObj->GetK1(), pObj->GetK2(), pObj->GetK3());
		if (m_pFirstObject)
		{
			m_pFirstObject->m_pPrev = pObject;// mark this new object as a previous for current first object
			pObject->m_pNext = m_pFirstObject;// connect current first object to this object
			pObject->m_pPrev = NULL;
		}
		m_pFirstObject = pObject;
	}
}

void ObjectManager::RemoveObject(CBaseObject *pObject)
{
	CBaseObject *pObj = m_pFirstObject;

	while (pObj)
	{
		if (pObj == pObject)// found
		{
			if (pObj->m_pPrev)
			{
				pObj->m_pPrev->m_pNext = pObj->m_pNext;
				if (pObj->m_pNext)
					pObj->m_pNext->m_pPrev = pObj->m_pPrev;
			}
			else// pObj have no m_pPrev, so this is the first object in chain
			{
				m_pFirstObject = pObj->m_pNext;
			}
			delete pObj;
			pObj = NULL;
			return;
		}
		else
			pObj = pObj->m_pNext;
	}
}

void ObjectManager::RemoveAllObjects(void)
{
	printf("ObjectManager: removing all objects\n");
	CBaseObject *pObj = m_pFirstObject;
	CBaseObject *pNext = NULL;

	while (pObj)
	{
		pNext = pObj->m_pNext;
//		printf("ObjectManager: deleting object: %f %f %f\n", pObj->GetK1(), pObj->GetK2(), pObj->GetK3());
		delete pObj;
		pObj = pNext;
	}

	m_pFirstObject = NULL;
}

void ObjectManager::PrintObjects(void)
{
	CBaseObject *pObj = m_pFirstObject;
	CDerivedObject *tmp = NULL;
	int i=0;
	while (pObj)
	{
		tmp = (CDerivedObject *)pObj;
		if (tmp && tmp->GetData())
			printf("Derived Object %d: %f %f %f\n", i, tmp->GetK1(), tmp->GetK2(), tmp->GetK3());

		pObj = pObj->m_pNext;
		i++;
	}
}

CBaseObject *ObjectManager::FindObjectByValue(float k1, float k2, float k3)
{
	CBaseObject *pObj = m_pFirstObject;
	CDerivedObject *tmp = NULL;
	while (pObj)
	{
		tmp = (CDerivedObject *)pObj;
		if (tmp && tmp->GetData())
		{
			if (tmp->GetK1() == k1 &&
				tmp->GetK2() == k2 &&
				tmp->GetK3() == k3)
				return pObj;
		}

		pObj = pObj->m_pNext;
	}
	return NULL;
}

void main()
{
	CBaseObject *pObj = NULL;
	ObjectManager mgr;

	for (int i=1; i < 9; i++)
	{
		pObj = new CDerivedObject(100*i, 10*i, i);
		mgr.AddObject(pObj);
		pObj = NULL;
	}

	mgr.PrintObjects();

	float k1, k2, k3;
	printf("Enter values to search: ");
	scanf("%f %f %f", &k1, &k2, &k3);
	pObj = mgr.FindObjectByValue(k1, k2, k3);
	if (pObj)
		printf("Found!\n");

	getch();
}
Соседние файлы в папке var09 my