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
Preferisci utilizzare Facebook, Twitter o Google+?
Prevalentemente Facebook
Prevalentemente Twitter
Prevalentemente Google+
Facebook e Twitter
Twitter e Google+
Google+ e Facebook
Tutti e tre
Nessuno dei tre

Mostra i risultati (2818 voti)
Luglio 2024
La Marina tedesca cerca una soluzione per sostituire i floppy da 8 pollici
WhatsApp, arriva la trascrizione automatica dei messaggi vocali
10 miliardi di password rubate e pubblicate in chiaro
Copilot si aggiorna e diventa inutile
La super SIM cinese con processore RISC-V
Giugno 2024
Tim al capolinea: dal 2 luglio la Rete non sarà più sua
Gli USA mettono al bando Kaspersky
Windows 11, l'ultimo aggiornamento è infestato da bug
Il viaggio verso Marte rischia di devastare i reni degli astronauti
2030, Mastercard elimina il numero della carta di credito.
HP, un BIOS difettoso rende inutilizzabili i ProBook
Adobe, utenti in rivolta contro i nuovi Termini d'Uso
Napster compie 25 anni
Tre libri
Maggio 2024
Chatbot, fallimenti a ripetizione
Tutti gli Arretrati
Accadde oggi - 18 luglio


web metrics