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
Qual è secondo te la peggiore invenzione della storia?
Le sigarette
I fast food
Le armi
Il nucleare
La Chiesa
La televisione
L'automobile
I telefoni cellulari
Gli autovelox

Mostra i risultati (8437 voti)
Febbraio 2026
Winhance ottimizza Windows 11: meno app inutili, più velocità e controllo sistema
Grave falla in Chrome già attivamente sfruttata: aggiornare subito il browser di Google
Western Digital ha già venduto tutti gli hard disk del 2026
Claude, il piano gratuito si potenzia: quattro funzioni premium ora accessibili a tutti
Windows più leggero e veloce: WinUtil elimina il superfluo e personalizza il sistema in profondità
Agenzia delle Entrate su IO: avvisi, scadenze e comunicazioni fiscali
Stampanti datate a rischio? Microsoft ritira i driver legacy in Windows 11
Fine dell'era 8K, LG interrompe la produzione
Il dottor IA è sempre disponibile e gratuito. Ora è autorizzato a operare come un medico vero
Il mercato è invaso da SSD fake, inaffidabili e con prestazioni inferiori
L'Europa accende IRIS 2, la costellazione satellitare che vuole ridurre la dipendenza da Starlink
Apple rivoluziona l'acquisto dei Mac
Gennaio 2026
WhatsApp, chatbot di terze parti a pagamento. Ma solo in Italia
WhatsApp, 4 euro al mese per rimuovere la pubblicità
Windows 11, aggiornamento d'emergenza risolve i bug della patch di gennaio
Tutti gli Arretrati
Accadde oggi - 20 febbraio


web metrics