Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Opmerking
De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.
De belangrijkste basisklasse voor de Microsoft Foundation Class Library.
Syntaxis
class AFX_NOVTABLE CObject
Leden
Beveiligde constructors
| Naam | Description |
|---|---|
CObject::CObject |
Standaardconstructor. |
Openbare methoden
| Naam | Description |
|---|---|
CObject::AssertValid |
Valideert de integriteit van dit object. |
CObject::Dump |
Produceert een diagnostische dump van dit object. |
CObject::GetRuntimeClass |
Retourneert de CRuntimeClass structuur die overeenkomt met de klasse van dit object. |
CObject::IsKindOf |
Test de relatie van dit object met een bepaalde klasse. |
CObject::IsSerializable |
Tests om te zien of dit object kan worden geserialiseerd. |
CObject::Serialize |
Hiermee wordt een object van/naar een archief geladen of opgeslagen. |
Openbare operators
| Naam | Description |
|---|---|
CObject::operator delete |
Speciale delete operator. |
CObject::operator new |
Speciale new operator. |
Opmerkingen
Het fungeert niet alleen als hoofdmap voor bibliotheekklassen, zoals CFile en CObList, maar ook voor de klassen die u schrijft.
CObject biedt basisservices, waaronder
- Ondersteuning voor serialisatie
- Informatie over runtimeklasse
- Diagnostische uitvoer van object
- Compatibiliteit met verzamelingsklassen
CObject biedt geen ondersteuning voor meerdere overnames. Uw afgeleide klassen kunnen slechts één CObject basisklasse hebben en dat CObject moet het meest links in de hiërarchie staan. Het is echter toegestaan om structuren en niet-afgeleide CObjectklassen in meerdere overnamevertakkingen rechts te hebben.
U realiseert zich grote voordelen van CObject afleiding als u enkele van de optionele macro's in uw klasse-implementatie en declaraties gebruikt.
Met de macro's DECLARE_DYNAMIC op het eerste niveau kunt IMPLEMENT_DYNAMICu runtimetoegang tot de klassenaam en de positie ervan in de hiërarchie toestaan. Dit maakt op zijn beurt zinvolle diagnostische dumping mogelijk.
De macro's DECLARE_SERIAL op het tweede niveau en IMPLEMENT_SERIALbevatten alle functionaliteit van de macro's op het eerste niveau en maken het mogelijk om een object te 'serialiseren' naar en van een 'archief'.
Zie CObject en Serialisatie gebruiken voor informatie over het afleiden van Microsoft Foundation-klassen en C++-klassen in het algemeen en het gebruik CObjectervan.
Overnamehiërarchie
CObject
Requirements
Rubriek:afx.h
CObject::AssertValid
Valideert de integriteit van dit object.
virtual void AssertValid() const;
Opmerkingen
AssertValid voert een geldigheidscontrole voor dit object uit door de interne status ervan te controleren. In de foutopsporingsversie van de bibliotheek AssertValid kunt u het programma bevestigen en vervolgens beëindigen met een bericht met het regelnummer en de bestandsnaam waarin de assertie is mislukt.
Wanneer u uw eigen klasse schrijft, moet u de AssertValid functie overschrijven om diagnostische services te bieden voor uzelf en andere gebruikers van uw klas. De overschreven AssertValid functie wordt meestal de functie van de AssertValid basisklasse aangeroepen voordat gegevensleden worden gecontroleerd die uniek zijn voor de afgeleide klasse.
Omdat AssertValid dit een const functie is, kunt u de objectstatus niet wijzigen tijdens de test. Uw eigen afgeleide klassefuncties AssertValid mogen geen uitzonderingen genereren, maar moeten wel bevestigen of ze ongeldige objectgegevens detecteren.
De definitie van 'geldigheid' is afhankelijk van de klasse van het object. In de regel moet de functie een 'ondiepe controle' uitvoeren. Als een object aanwijzers naar andere objecten bevat, moet het dus controleren of de aanwijzers dat niet NULLzijn, maar het mag geen geldigheidstests uitvoeren op de objecten waarnaar wordt verwezen door de aanwijzers.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in alle CObject voorbeelden wordt gebruikt.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Zie voor een ander voorbeeld AfxDoForAllObjects.
CObject::CObject
Deze functies zijn de standaardconstructors CObject .
CObject();
CObject(const CObject& objectSrc);
Parameterwaarden
objectSrc
Een verwijzing naar een andere CObject
Opmerkingen
De standaardversie wordt automatisch aangeroepen door de constructor van uw afgeleide klasse.
Als uw klasse serialiseerbaar is (deze bevat de IMPLEMENT_SERIAL macro), moet u een standaardconstructor (een constructor zonder argumenten) hebben in de klassedeclaratie. Als u geen standaardconstructor nodig hebt, declareert u een privé- of beveiligde 'lege' constructor. Zie Using CObjectvoor meer informatie.
De standaard C++-standaardklassekopieconstructor voert een lid-per-lid-kopie uit. De aanwezigheid van de privékopieconstructor CObject garandeert een compilerfoutbericht als de kopieerconstructor van uw klasse nodig is, maar niet beschikbaar is. Geef een kopieerconstructor op als deze mogelijkheid is vereist voor uw klasse.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in de CObject voorbeelden wordt gebruikt.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Dumpt de inhoud van het object naar een CDumpContext object.
virtual void Dump(CDumpContext& dc) const;
Parameterwaarden
dc
De context voor diagnostische dump voor dumping, meestal afxDump.
Opmerkingen
Wanneer u uw eigen klasse schrijft, moet u de Dump functie overschrijven om diagnostische services te bieden voor uzelf en andere gebruikers van uw klas. De overschreven Dump functie wordt meestal de functie van de Dump basisklasse aangeroepen voordat gegevensleden worden afgedrukt die uniek zijn voor de afgeleide klasse.
CObject::Dump drukt de naam van de klas af als uw klas gebruikmaakt van de IMPLEMENT_DYNAMIC of IMPLEMENT_SERIAL macro.
Opmerking
Uw Dump functie mag geen nieuw regelteken aan het einde van de uitvoer afdrukken.
Dump aanroepen zijn alleen zinvol in de foutopsporingsversie van de Microsoft Foundation Class Library. U moet aanroepen tussen vierkante haken, functiedeclaraties en functie-implementaties met #ifdef _DEBUGinstructies #endif voor voorwaardelijke compilatie.
Omdat Dump dit een const functie is, kunt u de objectstatus niet wijzigen tijdens de dump.
De CDumpContext invoegoperator (<<) roept aan Dump wanneer een CObject aanwijzer wordt ingevoegd.
Dump staat alleen "acyclische" dumping van objecten toe. U kunt bijvoorbeeld een lijst met objecten dumpen, maar als een van de objecten de lijst zelf is, loopt u de stapel uiteindelijk over.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in alle CObject voorbeelden wordt gebruikt.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
Retourneert de CRuntimeClass structuur die overeenkomt met de klasse van dit object.
virtual CRuntimeClass* GetRuntimeClass() const;
Retourwaarde
Een aanwijzer naar de CRuntimeClass structuur die overeenkomt met de klasse van dit object; nooit NULL.
Opmerkingen
Er is één CRuntimeClass structuur voor elke CObject-afgeleide klasse. De structuurleden zijn als volgt:
LPCSTR m_lpszClassNameEen door null beëindigde tekenreeks met de naam van de ASCII-klasse.int m_nObjectSizeDe grootte van het object, in bytes. Als het object gegevensleden bevat die verwijzen naar toegewezen geheugen, wordt de grootte van dat geheugen niet opgenomen.UINT m_wSchemaHet schemanummer (-1 voor niet-beserialiseerde klassen). Zie deIMPLEMENT_SERIALmacro voor een beschrijving van het schemanummer.CObject* (PASCAL* m_pfnCreateObject)()Een functieaanwijzer naar de standaardconstructor waarmee een object van uw klasse wordt gemaakt (alleen geldig als de klasse dynamische creatie ondersteunt; anders wordt geretourneerdNULL).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()Als uw toepassing dynamisch is gekoppeld aan de AFXDLL-versie van MFC, wijst u een aanwijzer naar een functie die deCRuntimeClassstructuur van de basisklasse retourneert.CRuntimeClass* m_pBaseClassAls uw toepassing statisch is gekoppeld aan MFC, wijst u de structuur van de basisklasse aanCRuntimeClass.
Voor deze functie is het gebruik van de IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATEof IMPLEMENT_SERIAL macro in de klasse-implementatie vereist. Anders krijgt u onjuiste resultaten.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in alle CObject voorbeelden wordt gebruikt.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Test de relatie van dit object met een bepaalde klasse.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Parameterwaarden
pClass
Een aanwijzer naar een CRuntimeClass structuur die is gekoppeld aan uw CObject-afgeleide klasse.
Retourwaarde
Niet-nul als het object overeenkomt met de klasse; anders 0.
Opmerkingen
Met deze functie wordt getest pClass of (1) het een object van de opgegeven klasse is of (2) het een object is van een klasse die is afgeleid van de opgegeven klasse. Deze functie werkt alleen voor klassen die zijn gedeclareerd met de DECLARE_DYNAMIC, DECLARE_DYNCREATEof DECLARE_SERIAL macro.
Gebruik deze functie niet uitgebreid omdat het de C++ polymorfismefunctie verslaat. Gebruik in plaats daarvan virtuele functies.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in alle CObject voorbeelden wordt gebruikt.
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
Test of dit object in aanmerking komt voor serialisatie.
BOOL IsSerializable() const;
Retourwaarde
Niet-nul als dit object kan worden geserialiseerd; anders 0.
Opmerkingen
Als een klasse serialiseerbaar is, moet de declaratie de DECLARE_SERIAL macro bevatten en moet de implementatie de IMPLEMENT_SERIAL macro bevatten.
Opmerking
Overschrijf deze functie niet.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in alle CObject voorbeelden wordt gebruikt.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Voor de releaseversie van de bibliotheek wordt door de operator delete het geheugen vrijgemaakt dat door de operator newis toegewezen.
void PASCAL operator delete(void* p);
void PASCAL operator delete(
void* p,
void* pPlace);
void PASCAL operator delete(
void* p,
LPCSTR lpszFileName,
int nLine);
Opmerkingen
In de foutopsporingsversie neemt operator delete deel aan een toewijzingsbewakingsschema dat is ontworpen om geheugenlekken te detecteren.
Als u de coderegel gebruikt
#define new DEBUG_NEW
voor een van uw implementaties in een . CPP-bestand en vervolgens de derde versie van delete wordt gebruikt, waarbij de bestandsnaam en het regelnummer worden opgeslagen in het toegewezen blok voor latere rapportage. U hoeft zich geen zorgen te maken over het opgeven van de extra parameters; een macro zorgt voor u.
Zelfs als u niet in de foutopsporingsmodus gebruikt DEBUG_NEW , krijgt u nog steeds detectie van lekken, maar zonder de hierboven beschreven rapportage over bronbestandsnummers.
Als u operators new overschrijft en deleteu deze diagnostische functie kwijt bent.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in de CObject voorbeelden wordt gebruikt.
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
Voor de releaseversie van de bibliotheek voert de operator new een optimale geheugentoewijzing uit op een manier die vergelijkbaar is met 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);
Opmerkingen
In de foutopsporingsversie neemt operator new deel aan een toewijzingsbewakingsschema dat is ontworpen om geheugenlekken te detecteren.
Als u de coderegel gebruikt
#define new DEBUG_NEW
voor een van uw implementaties in een . CPP-bestand en vervolgens de tweede versie van new wordt gebruikt, waarbij de bestandsnaam en het regelnummer worden opgeslagen in het toegewezen blok voor latere rapportage. U hoeft zich geen zorgen te maken over het opgeven van de extra parameters; een macro zorgt voor u.
Zelfs als u niet in de foutopsporingsmodus gebruikt DEBUG_NEW , krijgt u nog steeds detectie van lekken, maar zonder de hierboven beschreven rapportage over bronbestandsnummers.
Opmerking
Als u deze operator overschrijft, moet u ook overschrijven delete. Gebruik de standaardbibliotheekfunctie _new_handler niet.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in de CObject voorbeelden wordt gebruikt.
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
Leest of schrijft dit object van of naar een archief.
virtual void Serialize(CArchive& ar);
Parameterwaarden
ar
Een CArchive object dat moet worden geserialiseerd naar of van.
Opmerkingen
Overschrijven Serialize voor elke klasse die u wilt serialiseren. De overschreven Serialize functie moet eerst de functie van de Serialize basisklasse aanroepen.
U moet ook de DECLARE_SERIAL macro in uw klasdeclaratie gebruiken en u moet de IMPLEMENT_SERIAL macro in de implementatie gebruiken.
Gebruik CArchive::IsLoading of CArchive::IsStoring om te bepalen of het archief wordt geladen of opgeslagen.
Serialize wordt aangeroepen door CArchive::ReadObject en CArchive::WriteObject. Deze functies zijn gekoppeld aan de CArchive invoegoperator ( <<) en extractieoperator ( >>).
Zie het artikel Een object serialiseren voor voorbeelden van serialisatie.
Example
Zie CObList::CObList voor een lijst van de CAge klasse die in alle CObject voorbeelden wordt gebruikt.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}