Калькулятор
схема
сложения
схема
вычитания
схема
умножения
схема
деления
регистр
сумматор
В примере приведены определения основных классов и типов и реализации только некоторых компонентных функций.
class TShema;
class TObject //абстрактый класс - стоит во главе иерархии классов
{protected:
TShema* owner;
public:
TObject();
~TObject();
virtual void HandleEvent(TEvent&);
virtual void ClearEvent(TEvent&);
};
class TShema::public TObject // абстрактная группа
{protected:
TItem* last;
public:
TShema();
~TShema();
virtual void Insert(TObject*);
virtual void HandleEvent(TEvent&);
};
class TDevice: public TShema // абстрактное устройство управления
{protected:
int EndState;
public:
virtual void GetEvent(TEvent&);
virtual void Execute();
virtual int Valid();
virtual void EndExec();
};
class TRec: public TObject/ устройство для хранения данных-регистр
{protected:
float x;
public:
TReg();
~TReg();
float GetX();
void SetX(float&);
};
class TCalc : public TDevice //калькулятор
{pritected:
TReg* sum; // указатель на сумматор
TReg* reg; // указатель на регистр
public:
TCalc();
void HamdleEvent(TEvent&);
void GetEvent(TEvent&);
void Execute();
float GetSum(); // получить значение сумматора
void PutSum(float); //занести число в сумматор
voit Help();
};
class TAdd : public TObject // схема сложения
{public:
void HandleEvent(TEvent&);
void Add();
};
TObject::TObject()
{owner=0;}
TShema::TShema()
{last=0;}
TCalc::TCalc()
{TObject* r;
sum=new TReg;
reg=new TReg;
r=new TAdd;
Insert (sum);
// и так далее для всех схем
};
TCalc::HandleEvent(TEvent& event)
{if(event.what==evMessage)
switch(event.command)
{cmQuit:
EndExec();
ClearEvent(event);
break;
cmGet:
cout<<GetSum()<<endl;
ClearEvent(event);
break;
cmSet:
PutSum(event.A);
ClearEvent(event);
break;
default:
TSheme::HandleEvent(event);
} }
TSheme::HandleEvent(TEvent&event)
{TItem* r;
if(event.what==evMassage)
{r=last;
while(event.what!=evNothing&&r!=0)
{r->HandleEvent(event);
r=r->next;}
} }
TAdd::HandleEvent(TEvent&event)
{if(event.what==evMessage)
switch(event.command)
{cmAdd:
//занести в регистр число
(owner->reg)->SetX(event.A);
//вызвать метод сложения
Add();
ClearEvent(event);
break;
} }
TAdd::Add() //в сумматор добавить содержимое регистра
{float a,b;
//получить значение сумматора
a=(owner->sum)->GetX();
//получить значение регистра
b=(owner->reg)->GetX();
//изменить значение сумматора
(owner->sum)->SetX(a+b);
}