Corso di Visual C++

Identificare le Classi derivate daCObject

 

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