Classe CObject
Classe base principale per la libreria Microsoft Foundation Class.
Sintassi
class AFX_NOVTABLE CObject
Membri
Costruttori protetti
Nome | Descrizione |
---|---|
CObject::CObject |
Costruttore predefinito. |
Metodi pubblici
Nome | Descrizione |
---|---|
CObject::AssertValid |
Convalida l'integrità di questo oggetto. |
CObject::Dump |
Produce un dump di diagnostica di questo oggetto. |
CObject::GetRuntimeClass |
Restituisce la CRuntimeClass struttura corrispondente alla classe dell'oggetto. |
CObject::IsKindOf |
Verifica la relazione dell'oggetto con una determinata classe. |
CObject::IsSerializable |
Verifica se questo oggetto può essere serializzato. |
CObject::Serialize |
Carica o archivia un oggetto da/in un archivio. |
Operatori pubblici
Nome | Descrizione |
---|---|
CObject::operator delete |
Operatore speciale delete . |
CObject::operator new |
Operatore speciale new . |
Osservazioni:
Funge da radice non solo per le classi di libreria, CFile
ad esempio e CObList
, ma anche per le classi scritte. CObject
fornisce servizi di base, tra cui
- Supporto per la serializzazione
- Informazioni sulle classi di runtime
- Output di diagnostica degli oggetti
- Compatibilità con le classi di raccolta
CObject
non supporta l'ereditarietà multipla. Le classi derivate possono avere una CObject
sola classe di base e che CObject
devono essere più a sinistra nella gerarchia. È tuttavia consentito avere strutture e classi non CObject
derivate in rami di ereditarietà multipla di destra.
Si otterranno grandi vantaggi dalla CObject
derivazione se si usano alcune delle macro facoltative nell'implementazione e nelle dichiarazioni della classe.
Le macro di DECLARE_DYNAMIC
primo livello e IMPLEMENT_DYNAMIC
, consentono l'accesso in fase di esecuzione al nome della classe e alla relativa posizione nella gerarchia. Ciò, a sua volta, consente un dump diagnostico significativo.
Le macro DECLARE_SERIAL
di secondo livello e IMPLEMENT_SERIAL
, includono tutte le funzionalità delle macro di primo livello e consentono a un oggetto di essere "serializzato" da e verso un "archivio".
Per informazioni sulla derivazione delle classi Microsoft Foundation e delle classi C++ in generale e sull'uso CObject
di , vedere Uso di CObject e serializzazione.
Gerarchia di ereditarietà
CObject
Requisiti
Intestazione: afx.h
CObject::AssertValid
Convalida l'integrità di questo oggetto.
virtual void AssertValid() const;
Osservazioni:
AssertValid
esegue un controllo di validità su questo oggetto controllandone lo stato interno. Nella versione Debug della libreria può AssertValid
asserire e quindi terminare il programma con un messaggio che elenca il numero di riga e il nome file in cui l'asserzione non è riuscita.
Quando si scrive una classe personalizzata, è necessario eseguire l'override della AssertValid
funzione per fornire servizi di diagnostica per se stessi e altri utenti della classe. L'override AssertValid
chiama in genere la AssertValid
funzione della relativa classe di base prima di controllare i membri dati univoci per la classe derivata.
Poiché AssertValid
è una const
funzione, non è consentito modificare lo stato dell'oggetto durante il test. Le funzioni di classe AssertValid
derivate personalizzate non devono generare eccezioni, ma devono invece asserire se rilevano dati di oggetto non validi.
La definizione di "validità" dipende dalla classe dell'oggetto. Come regola, la funzione deve eseguire un "controllo superficiale". Ovvero, se un oggetto contiene puntatori ad altri oggetti, deve verificare se i puntatori non NULL
sono , ma non deve eseguire test di validità sugli oggetti a cui fanno riferimento i puntatori.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata in tutti gli CObject
esempi.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Per un altro esempio, vedere AfxDoForAllObjects
.
CObject::CObject
Queste funzioni sono i costruttori standard CObject
.
CObject();
CObject(const CObject& objectSrc);
Parametri
objectSrc
Riferimento a un altro CObject
Osservazioni:
La versione predefinita viene chiamata automaticamente dal costruttore della classe derivata.
Se la classe è serializzabile (incorpora la IMPLEMENT_SERIAL
macro), è necessario disporre di un costruttore predefinito (un costruttore senza argomenti) nella dichiarazione di classe. Se non è necessario un costruttore predefinito, dichiarare un costruttore "vuoto" privato o protetto. Per altre informazioni, vedere Uso di CObject
.
Il costruttore di copia della classe C++ standard esegue una copia membro per membro. La presenza del costruttore di copia privata CObject
garantisce un messaggio di errore del compilatore se il costruttore di copia della classe è necessario ma non disponibile. Specificare un costruttore di copia se la classe richiede questa funzionalità.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata negli CObject
esempi.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Esegue il dump del contenuto dell'oggetto in un CDumpContext
oggetto .
virtual void Dump(CDumpContext& dc) const;
Parametri
dc
Contesto del dump di diagnostica per il dump, in genere afxDump
.
Osservazioni:
Quando si scrive una classe personalizzata, è necessario eseguire l'override della Dump
funzione per fornire servizi di diagnostica per se stessi e altri utenti della classe. L'oggetto sottoposto a override Dump
chiama in genere la Dump
funzione della relativa classe di base prima di stampare membri dati univoci per la classe derivata. CObject::Dump
stampa il nome della classe se la classe utilizza la IMPLEMENT_DYNAMIC
macro o IMPLEMENT_SERIAL
.
Nota
La Dump
funzione non deve stampare un carattere di nuova riga alla fine dell'output.
Dump
le chiamate hanno senso solo nella versione Debug della libreria di classi Microsoft Foundation. È consigliabile inserire tra parentesi le chiamate, le dichiarazioni di funzione e le implementazioni di funzioni con #ifdef _DEBUG
istruzioni , #endif
per la compilazione condizionale.
Poiché Dump
è una const
funzione, non è consentito modificare lo stato dell'oggetto durante il dump.
L'operatore CDumpContext
di inserimento (<<) chiama Dump
quando viene inserito un CObject
puntatore.
Dump
consente solo il dump "aciclico" di oggetti. È possibile eseguire il dump di un elenco di oggetti, ad esempio, ma se uno degli oggetti è l'elenco stesso, alla fine si sovrapporrà lo stack.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata in tutti gli CObject
esempi.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
Restituisce la CRuntimeClass
struttura corrispondente alla classe dell'oggetto.
virtual CRuntimeClass* GetRuntimeClass() const;
Valore restituito
Puntatore alla CRuntimeClass
struttura corrispondente alla classe dell'oggetto; mai NULL
.
Osservazioni:
Esiste una CRuntimeClass
struttura per ogni CObject
classe derivata da . I membri della struttura sono i seguenti:
LPCSTR m_lpszClassName
Stringa con terminazione Null contenente il nome della classe ASCII.int m_nObjectSize
Dimensione dell'oggetto, in byte. Se l'oggetto dispone di membri dati che puntano alla memoria allocata, le dimensioni di tale memoria non sono incluse.UINT m_wSchema
Numero di schema ( -1 per le classi nonerializzabili). Per una descrizione del numero di schema, vedere laIMPLEMENT_SERIAL
macro.CObject* (PASCAL* m_pfnCreateObject)()
Puntatore di funzione al costruttore predefinito che crea un oggetto della classe (valido solo se la classe supporta la creazione dinamica; in caso contrario, restituisceNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Se l'applicazione è collegata dinamicamente alla versione AFXDLL di MFC, un puntatore a una funzione che restituisce laCRuntimeClass
struttura della classe di base.CRuntimeClass* m_pBaseClass
Se l'applicazione è collegata staticamente a MFC, un puntatore allaCRuntimeClass
struttura della classe di base.
Questa funzione richiede l'uso IMPLEMENT_DYNAMIC
della macro , IMPLEMENT_DYNCREATE
o IMPLEMENT_SERIAL
nell'implementazione della classe . In caso contrario, si otterranno risultati non corretti.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata in tutti gli CObject
esempi.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Verifica la relazione dell'oggetto con una determinata classe.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Parametri
pClass
Puntatore a una CRuntimeClass
struttura associata alla CObject
classe derivata da .
Valore restituito
Diverso da zero se l'oggetto corrisponde alla classe ; in caso contrario, 0.
Osservazioni:
Questa funzione verifica pClass
se (1) è un oggetto della classe specificata o (2) è un oggetto di una classe derivata dalla classe specificata. Questa funzione funziona solo per le classi dichiarate con la DECLARE_DYNAMIC
macro , DECLARE_DYNCREATE
o DECLARE_SERIAL
.
Non usare questa funzione in modo esteso perché sconfigge la funzionalità di polimorfismo C++. Usare invece le funzioni virtuali.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata in tutti gli CObject
esempi.
CAge a(21); // Must use IMPLEMENT_DYNAMIC, IMPLEMENT _DYNCREATE, or
// IMPLEMENT_SERIAL
ASSERT(a.IsKindOf(RUNTIME_CLASS(CAge)));
ASSERT(a.IsKindOf(RUNTIME_CLASS(CObject)));
CObject::IsSerializable
Verifica se questo oggetto è idoneo per la serializzazione.
BOOL IsSerializable() const;
Valore restituito
Diverso da zero se questo oggetto può essere serializzato; in caso contrario, 0.
Osservazioni:
Affinché una classe possa essere serializzabile, la relativa dichiarazione deve contenere la DECLARE_SERIAL
macro e l'implementazione deve contenere la IMPLEMENT_SERIAL
macro.
Nota
Non eseguire l'override di questa funzione.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata in tutti gli CObject
esempi.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Per la versione Release della libreria, l'operatore delete
libera la memoria allocata dall'operatore new
.
void PASCAL operator delete(void* p);
void PASCAL operator delete(
void* p,
void* pPlace);
void PASCAL operator delete(
void* p,
LPCSTR lpszFileName,
int nLine);
Osservazioni:
Nella versione Debug l'operatore delete
partecipa a uno schema di monitoraggio dell'allocazione progettato per rilevare le perdite di memoria.
Se si usa la riga di codice
#define new DEBUG_NEW
prima di una delle implementazioni in un oggetto . Il file CPP, quindi verrà usata la terza versione di , archiviando il nome file e il numero di riga nel blocco allocato per la creazione di delete
report successivi. Non è necessario preoccuparsi di fornire i parametri aggiuntivi; una macro si occupa di questo per te.
Anche se non si usa DEBUG_NEW
in modalità debug, si ottiene comunque il rilevamento delle perdite, ma senza la segnalazione del numero di riga del file di origine descritto in precedenza.
Se si esegue l'override degli operatori new
e delete
, si esegue il forfeit di questa funzionalità di diagnostica.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata negli CObject
esempi.
void CAge::operator delete(void* p)
{
free(p);
}
void CAge::operator delete(void *p, LPCSTR lpszFileName, int nLine)
{
UNREFERENCED_PARAMETER(lpszFileName);
UNREFERENCED_PARAMETER(nLine);
free(p);
}
CObject::operator new
Per la versione Release della libreria, l'operatore new
esegue un'allocazione di memoria ottimale in modo simile a malloc
.
void* PASCAL operator new(size_t nSize);
void* PASCAL operator new(size_t, void* p);
void* PASCAL operator new(
size_t nSize,
LPCSTR lpszFileName,
int nLine);
Osservazioni:
Nella versione Debug l'operatore new
partecipa a uno schema di monitoraggio dell'allocazione progettato per rilevare le perdite di memoria.
Se si usa la riga di codice
#define new DEBUG_NEW
prima di una delle implementazioni in un oggetto . Il file CPP, quindi verrà usata la seconda versione di , archiviando il nome file e il numero di new
riga nel blocco allocato per la creazione di report successivi. Non è necessario preoccuparsi di fornire i parametri aggiuntivi; una macro si occupa di questo per te.
Anche se non si usa DEBUG_NEW
in modalità debug, si ottiene comunque il rilevamento delle perdite, ma senza la segnalazione del numero di riga del file di origine descritto in precedenza.
Nota
Se si esegue l'override di questo operatore, è anche necessario eseguire l'override di delete
. Non usare la funzione della libreria _new_handler
standard.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata negli CObject
esempi.
void* CAge::operator new(size_t nSize)
{
return malloc(nSize);
}
void* CAge::operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
UNREFERENCED_PARAMETER(lpszFileName);
UNREFERENCED_PARAMETER(nLine);
return malloc(nSize);
}
CObject::Serialize
Legge o scrive l'oggetto corrente da o in un archivio.
virtual void Serialize(CArchive& ar);
Parametri
ar
Oggetto CArchive
da serializzare da o verso.
Osservazioni:
Eseguire l'override Serialize
per ogni classe che si intende serializzare. L'override Serialize
deve prima chiamare la Serialize
funzione della relativa classe di base.
È inoltre necessario utilizzare la DECLARE_SERIAL
macro nella dichiarazione di classe ed è necessario utilizzare la IMPLEMENT_SERIAL
macro nell'implementazione.
Usare CArchive::IsLoading
o CArchive::IsStoring
per determinare se l'archivio sta caricando o archiviando.
Serialize
viene chiamato da CArchive::ReadObject
e CArchive::WriteObject
. Queste funzioni sono associate all'operatore di inserimento ( <<
) e all'operatore CArchive
di estrazione ( >>
).
Per esempi di serializzazione, vedere l'articolo Serializzazione di un oggetto.
Esempio
Vedere CObList::CObList
per un elenco della CAge
classe usata in tutti gli CObject
esempi.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}