Corso di Visual C++ (quinta lezione)

Le classi base CObject, CWinApp e CDocument di MFC. Nella scorsa puntata abbiamo trattato il sistema di gestione dei messaggi, ora inizieremo ad esplorare la gerarchia delle classi della MFC e vedremo come cercare di sfruttarla in base alle nostre esigenze.



[ZEUS News - www.zeusnews.it - 22-06-2001]

Leggi la quarta puntata del corso

Osservando la mappa gerarchica vediamo che la maggioranza delle classi deriva, direttamente o indirettamente, da CObject. Il motivo è che tale classe fornisce quattro servizi molto utili:

- Supporto per la serializzazione
- Supporto per avere informazioni sulle classi a Run-Time
- Supporto per il debugging e la diagnostica
- Supporto delle classi di collezione

Tramite la serializzazione è possibile, in un modo molto semplice che vedremo più avanti, salvare e caricare archivi da oggetti di memorizzazione come dischi o nastri. Le due funzioni principali sono IsSerializable e Serialize. Per utilizzare tale supporto nelle proprie classi derivate, bisogna includere la macro DECLARE_SERIAL nella dichiarazione di classe e IMPLEMENT_SERIAL nell'implementazione.

Esempio:

// MyClass.h
class CMyClass: public CObject
{
public:
   CMyClass();
   void Serialize( CArchive& archive );

   DECLARE_SERIAL(CMyClass)
};

// MyClass.cpp
#include "stdafx.h"
#include "MyClass.h"

IMPLEMENT_SERIAL( CMyClass, CObject, VERSIONABLE_SCHEMA | 2 )

...

Il supporto per le informazioni a Run-Time ci permette di avere informazioni su una classe avendo un puntatore ad un oggetto di una classe derivata da CObject; tali informazioni consistono ad esempio nel nome della classe o nel grado di parentela con altre classi. Le funzioni principali sono IsKindOf e GetRuntimeClass.

Si vuole far notare che tale supporto è uno strumento completamente diverso dal meccanismo di identificazione a run-time del C++ (RTTI).

Per utilizzare tale supporto nelle proprie classi derivate, bisogna includere la macro DECLARE_DYNAMIC nella dichiarazione di classe e IMPLEMENT_DYNAMIC nell'implementazione (vedere MSDN per approfondimenti).

Infine il supporto di debugging e di diagnostica ci mette a disposizione le due funzioni AssertValid e Dump che rispettivamente verificano lo stato interno di un oggetto e che mandano in output, nella finestra di Debug, informazioni diagnostiche da noi specificate.

Inoltre CObject sovraccarica gli operatori di allocazione dinamica della memoria, new e delete, per tenere traccia degli oggetti allocati; questa precauzione serve ad avvisarci su eventuali sprechi di memoria alla chiusura dell'applicazione quando dimentichiamo di deallocare oggetti creati dinamicamente.

La compatibilità con le classi di collezione ci permette di utilizzare gli oggetti della nostra classe con oggetti collezione di tipo CObList o CObArray. Microsoft consiglia di derivare tutte le proprie classi da CObject dato che oltre a tutti i vantaggi suddetti si ha un occupazione di spazio aggiuntiva veramente minima ( un oggetto di tipo CRuntimeClass e una VTable per quattro funzioni virtuali).

Altre classi base molto importanti per la nostra applicazione sono CWinApp, CDocument e CWnd.

CWinApp rappresenta l'applicazione nel vero senso del termine e comprende funzioni molto utili come ProcessShellCommand che elabora gli argomenti della linea di comando e OnFileOpen che implementa il comportamento del comando Apri del menu File. CWinApp è derivata da CWinThread che rappresenta il thread di esecuzione e che gestisce il comportamento del thread (priorità, Suspend, Resume...).

CDocument contiene funzioni membro per poter accedere ai file e alle viste ad esso collegate. Una funzione che useremo spesso di tale classe è SetModifiedFlag che ci segnala se il nostro documento è stato modificato e come effetto secondario ci fa apparire nella barra del titolo un asterisco accanto al nome del documento. La funzione IsModified ci ritorna non-zero se il documento è stato modificato, 0 altrimenti.

Altre tre funzioni spesso utilizzate sono OnNewDocument, OnOpenDocument e OnSaveDocument che vengono richiamate per creare, aprire e salvare un documento; si noti che queste funzioni sono dichiarate virtuali ed occorre scavalcarle nel caso si voglia cambiare il comportamento di default. Nel caso si scavalchi una di queste funzioni, non si deve dimenticare di richiamare la versione della classe base a meno che non si sa perfettamente cosa si sta facendo e quali sono poi le conseguenze; per fare un esempio se si scavalca OnNewDocument e non si richiama la versione della classe base (CDocument::OnNewDocument) non verrà mai richiamata la funzione DeleteContents che ripulisce il documento prima dell'utilizzo, lo marca come non-modificato e si assicura che sia vuoto.

Sia CWinThread che CDocument derivano da CCmdTarget che permette un sofisticato sistema di smistamento dei messaggi e trasformano la classe in un command target o "obiettivo di comando" in grado di ricevere ed elaborare i messaggi. Senza la derivazione da tale classe i messaggi potrebbero essere elaborati solo nella classe derivata da CWnd in cui vengono ricevuti.

Leggi la sesta puntata del corso

A cura di Software Planet il centro di riferimento per i programmatori e i webmaster italiani.
Su Software Planet è possibile trovare oltre a chat, newsletter, librerie di migliaia di script, forum di discussione, anche corsi online gratuiti e scaricabili di Visual C++, Visual Basic, Java, Delphi, ASP, HTML, Perl, PHP, JavaScript, CGI, DirectX, SistemiOperativi, SQL, C con Linux, WML, Logica ed Automi, Privacy, Flash, Dreamweaver, Fireworks, ActionScript...
Per iscriversi alla newsletter mandare un'email vuota a subscribe@softwareplanet.net

Se questo articolo ti è piaciuto e vuoi rimanere sempre informato con Zeus News ti consigliamo di iscriverti alla Newsletter gratuita. Inoltre puoi consigliare l'articolo utilizzando uno dei pulsanti qui sotto, inserire un commento (anche anonimo) o segnalare un refuso.
© RIPRODUZIONE RISERVATA

Commenti all'articolo (0)


La liberta' di parola e' un diritto inviolabile, ma nei forum di Zeus News vige un regolamento che impone delle restrizioni e che l'utente e' tenuto a rispettare. I moderatori si riservano il diritto di cancellare o modificare i commenti inseriti dagli utenti, senza dover fornire giustificazione alcuna. Gli utenti non registrati al forum inoltre sono sottoposti a moderazione preventiva. La responsabilita' dei commenti ricade esclusivamente sui rispettivi autori. I principali consigli: rimani sempre in argomento; evita commenti offensivi, volgari, violenti o che inneggiano all'illegalita'; non inserire dati personali, link inutili o spam in generale.
E' VIETATA la riproduzione dei testi e delle immagini senza l'espressa autorizzazione scritta di Zeus News. Tutti i marchi e i marchi registrati citati sono di proprietà delle rispettive società. Informativa sulla privacy. I tuoi suggerimenti sono di vitale importanza per Zeus News. Contatta la redazione e contribuisci anche tu a migliorare il sito: pubblicheremo sui forum le lettere piu' interessanti.
Sondaggio
Pensando all'acquisizione di Twitter e ai recenti avvenimenti, qual è il problema principale di Elon Musk?
Elon Musk dovrebbe smettere di scrivere tweet.
Elon Musk dovrebbe stare al di fuori della politica.
L'acquisizione di Twitter da parte di Elon Musk è una distrazione dalle sue responsabilità in SpaceX e Tesla.

Mostra i risultati (308 voti)
Aprile 2025
"Imbrogliare su tutto": dagli esami universitari ai colloqui di lavoro
Intel pronta a licenziare 20.000 persone
Fire TV stick, Amazon pronta a lasciare Android per Vega OS
Siti per adulti, Agcom impone la verifica dell’età con il doppio anonimato
Android sempre più esigente: ora servono almeno 32 Gbyte
Il terzo giorno Android si riavvia
Microsoft: ''Non toccate la cartella misteriosa''
Windows Recall, forse è la volta buona
Le funzioni di Skype che Teams non ha
WhatsApp per Windows: non aprite quell'immagine
Vibe coding: creare programmi senza saper programmare
Dalla Cina l'alternativa a HDMI e DisplayPort
Pesci d'aprile, ci casca anche la IA
Thunderbird si evolve: in arrivo una versione Pro e il servizio Thundermail
Segnali dal futuro
Tutti gli Arretrati
Accadde oggi - 28 aprile


web metrics