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
Il Garante Privacy ha istituito - ormai da anni - un servizio che in teoria dovrebbe tutelare la privacy dei cittadini iscritti, vietando ai call center di chiamare i loro numeri telefonici. Secondo la tua esperienza, il Registro delle Opposizioni funziona?
Sì. Sono iscritto e non mi scocciano praticamente mai.
Non lo so. Non sono iscritto.
No. Sono iscritto e continuo a ricevere telefonate con proposte commerciali.

Mostra i risultati (3314 voti)
Novembre 2025
Telemarketing aggressivo, operativo il filtro che impedisce lo spoofing dei numeri mobili
Cloudflare in tilt. Migliaia di siti irraggiungibili, servizi bloccati in tutto il mondo
E se Internet sparisse?
Windows diventerà un Agentic OS. Microsoft entusiasta, gli utenti temono guai
Database con dati personali di 3,8 milioni di italiani pubblicato nel dark web
I crescenti segni dell'esplosione
WhatsApp apre le porte a Telegram, Signal e altri servizi: inizia l'era delle chat cross-app
Con Gemini Google Maps ti parla davvero: indicazioni vocali, punti di riferimento e AI
La RAM costa più dell'oro: l'intelligenza artificiale fa impennare i prezzi della DRAM
App di autenticazione e chiavi hardware, anche di scorta
Resuscitare l'aspirapolvere smart ucciso da remoto dal produttore
AGCOM, ecco la lista dei siti porno che richiederanno la verifica dell'età: si parte il 12 novembre
Ottobre 2025
Microsoft Azure in crisi: il disservizio ha fermato le Poste, Starbucks e il Parlamento scozzese
Anche Aranzulla teme la IA: il calo del traffico è reale e coinvolge tutta l'editoria digitale
Oltre 2.000 pacchi Amazon scomparsi scovati dai Carabinieri in un magazzino nel milanese
Tutti gli Arretrati
Accadde oggi - 23 novembre


web metrics