Share via


CObject-klasse

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_lpszClassName Een door null beëindigde tekenreeks met de naam van de ASCII-klasse.

  • int m_nObjectSize De 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_wSchema Het schemanummer (-1 voor niet-beserialiseerde klassen). Zie de IMPLEMENT_SERIAL macro 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 geretourneerd NULL).

  • 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 de CRuntimeClass structuur van de basisklasse retourneert.

  • CRuntimeClass* m_pBaseClass Als uw toepassing statisch is gekoppeld aan MFC, wijst u de structuur van de basisklasse aan CRuntimeClass .

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;
}

Zie ook

Hiërarchiegrafiek