Alcuni di voi sicuramente si saranno detti:
le MFC già le avevamo viste all’inizio del corso, a che serve rivederle?
Tengo a precisare che ora le utilizzeremo + approfonditamente, con esempi
e sorgenti, più da un punto di vista di programmazione insomma.
Bene, detto ciò torniamo alla lezione.
Nella scorsa lezione ci eravamo lasciati promettendoci di vedere l’utilizzo
pratico dei metodi IsKindOf e GetRuntimeClass.
Nel codice sorgente che segue potrete facilmente notare la loro praticità.
Il programma in questione, una volta compilato chiede mostra all’utente la
seguente maschera:

Sono state allocate due classi derivate da CObject diverse tra
loro:
class CClassA : public
CObject
{
DECLARE_DYNAMIC(CClassA)
public:
int m_val;
CClassA();
virtual ~CClassA();
};
e
class CClassB : public
CObject
{
DECLARE_DYNAMIC(CClassB)
public:
char m_str[10];
CClassB();
virtual ~CClassB();
};
Come si nota le due classi si differiscono nei membri int m_val
per la classe A e char m_str[10] nella classe B (Si possono modificare
comunque a piacimento, nulla cambierà nel programma)
Lo scopo del programmino sarà individuare quale classe è stata
allocata.
Ciccando su uno dei due Radio Classe A o Classe B la classe ad
essa associata verrà conosciuta tramite due metodi:
Tramite CRuntimeClass;
verrà mostrata la MessageBox seguente :

Tramite IsKindOf.
Verrà mostrata la MessageBox seguente:

Semplice no?
Analizzate i sorgenti per una migliore analisi.
Il sistema usato nella creazione è DialogBased.
Per ogni problema o domanda contattatemi pure al mio indirizzo
e-mail.
Bene analizziamo ora la parte del codice principale, posta nelle
due funzioni OnRadio1() e OnRadio2(), rispettivamente
chiamate quando si clicca sui radio Class A e Class B.
void CCobTestDlg::OnRadio1()
{
CClassA tmp;
CRuntimeClass *ptr;
ptr=tmp.GetRuntimeClass();
StampaDati(ptr);
StampaDati2(tmp);
}
void CCobTestDlg::OnRadio2()
{
CClassB tmp;
CRuntimeClass *ptr;
ptr=tmp.GetRuntimeClass();
StampaDati(ptr);
StampaDati2(tmp);
}
void CCobTestDlg::StampaDati(CRuntimeClass *ptr)
{
if (ptr==RUNTIME_CLASS(CClassA))
MessageBox("Classe A riconosciuta tramite CRuntimeClass");
else if (ptr==RUNTIME_CLASS(CClassB))
MessageBox("Classe B riconosciuta tramite CRuntimeClass");
}
void CCobTestDlg::StampaDati2(CObject &tmp)
{
if (tmp.IsKindOf(RUNTIME_CLASS(CClassA)))
MessageBox("Classe A riconosciuta tramite IsKindOf(...)");
else if (tmp.IsKindOf(RUNTIME_CLASS(CClassB)))
MessageBox("Classe B riconosciuta tramite IsKindOf(...)");
}
Ciccando sul Radio Class A viene richiamato l’evento OnRadio1(),
rimappato per mezzo del Messaggio
afx_msg void OnRadio1(); nel file ObTestDlg.h
ON_BN_CLICKED(IDC_RADIO1, OnRadio1) nella MessageMap del file
ObTestDlg.cpp.
Analogamente avverrà cliccando sul Radio Class B; verrà richiamato
l’evento OnRadio2(), rimappato dualmente a OnRadio1.
Supponiamo di aver ciccato per esempio sul Radio Class A, dualmente
avverrà nel caso avessimo ciccato sul Radio Class B.
Viene richiamata la classe associata all’evento ONCLICK
del Radio Class A, ovvero OnRadio1().
Qui come si nota verrà implementata una classe di tipo CClassA,
la cui definizione è stata vista in precedenza.
A questo punto viene allocato un puntatore a una classe speciale
detta CRuntimeClass che ci consente di individuare una classe
per mezzo della MACRO RUNTIME_CLASS( nome_classe),passandolo alla
funzione StampaDati che implementerà il primo sistema di
riconoscimento della classe.
Il secondo metodo invece risiede nel passare alla funzione StampaDati2
la variabile stessa allocata per riferimento.
Questo metodo utilizzerà la funzione KindOf per verificarne
l’appartenenza (Classe A o Classe B?)
Bene, sperando di essere stato chiaro ( aho vi ho messo pure i
sorgenti, che devo fare più di questo???? :D )
Vi do un’arrivederci alla prossima puntata.
Torna all'indice Generale del corso di Corso di Visual C++ di Software Planet