Evo jedan primer, kada ja koristim "predložak klase", ako sam dobro shvatio
šta je predložak klase:
Na primer, jedna od cestih situacija u programiranju je:
Code:
ObjekatTipa1->Enabled = false;
ObjekatTipa2->Enabled = false;
ObjekatTipa3->Enabled = false;
UradiNesto();
ObjekatTipa1->Enabled = true;
ObjekatTipa2->Enabled = true;
ObjekatTipa3->Enabled = true;
E sad, ovde je problem sto ako nesto pukne u UradiNesto(), ni jedan Enabled = true
nece biti izvrsen. try/finally nije deo C++ jezika a u BCB-u i nije pouzdan. Poseban
slucaj je ako imas "return" negde ranije pa moras da vodis racuna da prethodno i
tu Enable-ujes objekte.
Tada se poseze za takozvanim RAII mehanizmom (kao kod std::auto_ptr) koji garantuje
da ce nakon izlaska iz scope-a biti izvrsen destruktor objekta.
Da ne bih pisao posebnu RAII klasu za svaki tip podataka, evo jednog resenja i to
za VCL, jer ga koristis:
--- H ---
Code:
template<typename TRAIIDisablerEnabler>class TRAII_DisableEnable
{
TRAIIDisablerEnabler * AObjectToControl;
public:
TRAII_DisableEnable( TRAIIDisablerEnabler * ObjectToControl )
{
AObjectToControl = ObjectToControl;
if( AObjectToControl )
{
AObjectToControl->Enabled = false;
}
}
virtual ~TRAII_DisableEnable()
{
if( AObjectToControl )
AObjectToControl->Enabled = true;
}
};
--- CPP ---
Code:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TRAII_DisableEnable<TButton> E1( Button1 );
TRAII_DisableEnable<TCheckBox> E2( CheckBox1 );
// UradiNesto();
Sleep( 3000 );
// destruktor ce sve vratiti na mesto Enabled = true;
}