Лабораторная работа №7
Востропятов Н. А.
Вар №9
#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;
pObject->m_pNext = m_pFirstObject;
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();
}
