CObject-Klasse

Die prinzipale Basisklasse für die Microsoft Foundation Class-Bibliothek.

Syntax

class AFX_NOVTABLE CObject

Member

Geschützte Konstruktoren

Name BESCHREIBUNG
CObject::CObject Standardkonstruktor

Öffentliche Methoden

name BESCHREIBUNG
CObject::AssertValid Überprüft die Integrität dieses Objekts.
CObject::Dump Erzeugt ein Diagnoseabbild dieses Objekts.
CObject::GetRuntimeClass Gibt die -Struktur zurück, die CRuntimeClass der -Klasse dieses Objekts entspricht.
CObject::IsKindOf Testet die Beziehung dieses Objekts zu einer bestimmten Klasse.
CObject::IsSerializable Testet, ob dieses Objekt serialisiert werden kann.
CObject::Serialize Lädt oder speichert ein Objekt aus einem/in ein Archiv.

Öffentliche Operatoren

Name BESCHREIBUNG
CObject::operator delete Spezieller delete Operator.
CObject::operator new Spezieller new Operator.

Hinweise

Er dient nicht nur als Stamm für Bibliotheksklassen wie CFile und CObList, sondern auch für die Klassen, die Sie schreiben. CObject bietet grundlegende Dienste, einschließlich

  • Serialisierungsunterstützung
  • Laufzeitklasseninformationen
  • Objektdiagnoseausgabe
  • Kompatibilität mit Auflistungsklassen

CObject unterstützt keine mehrfache Vererbung. Die abgeleiteten Klassen können nur über eine CObject Basisklasse verfügen, und diese CObject muss am weitesten in der Hierarchie liegen. Es ist jedoch zulässig, Strukturen und nicht CObjectabgeleitete Klassen in vererbungsverzweigten Vererbungsverzweigungen rechts zu haben.

Sie werden wichtige Vorteile der CObject Ableitung erzielen, wenn Sie einige der optionalen Makros in Ihrer Klassenimplementierung und -deklarationen verwenden.

Die Makros DECLARE_DYNAMIC der ersten Ebene und IMPLEMENT_DYNAMICermöglichen laufzeitbasierten Zugriff auf den Klassennamen und seine Position in der Hierarchie. Dies wiederum ermöglicht ein sinnvolles Diagnosedumping.

Die Makros der zweiten Ebene und DECLARE_SERIALIMPLEMENT_SERIALenthalten alle Funktionen der Makros der ersten Ebene und ermöglichen es, ein Objekt in ein und aus einem "Archiv" zu "serialisieren".

Informationen zum Ableiten von Microsoft Foundation-Klassen und C++-Klassen im Allgemeinen und zur Verwendung von CObjectfinden Sie unter Verwenden von CObject und Serialisierung.

Vererbungshierarchie

CObject

Anforderungen

Header:afx.h

CObject::AssertValid

Überprüft die Integrität dieses Objekts.

virtual void AssertValid() const;

Hinweise

AssertValid führt eine Gültigkeitsprüfung für dieses Objekt durch, indem der interne Zustand überprüft wird. In der Debugversion der Bibliothek kann das Programm bestätigen und dann mit einer Meldung beenden, AssertValid die die Zeilennummer und den Dateinamen auflistet, bei denen die Assertion fehlgeschlagen ist.

Wenn Sie Eine eigene Klasse schreiben, sollten Sie die AssertValid -Funktion überschreiben, um Diagnosedienste für sich selbst und andere Benutzer Ihrer Klasse bereitzustellen. Der überschriebene AssertValid ruft in der Regel die AssertValid -Funktion seiner Basisklasse auf, bevor die Datenmember überprüft werden, die für die abgeleitete Klasse eindeutig sind.

Da AssertValid eine const Funktion ist, dürfen Sie den Objektzustand während des Tests nicht ändern. Ihre eigenen abgeleiteten Klassenfunktionen AssertValid sollten keine Ausnahmen auslösen, sondern bestätigen, ob sie ungültige Objektdaten erkennen.

Die Definition der "Gültigkeit" hängt von der -Klasse des Objekts ab. In der Regel sollte die Funktion eine "flache Überprüfung" durchführen. Das heißt, wenn ein Objekt Zeiger auf andere Objekte enthält, sollte es überprüfen, ob die Zeiger nicht NULLsind, aber es sollte keine Gültigkeitstests für die Objekte durchführen, auf die von den Zeigern verwiesen wird.

Beispiel

Eine Auflistung der CAge in allen CObject Beispielen verwendeten Klasse finden Sie CObList::CObList unter .

void CAge::AssertValid() const
{
   CObject::AssertValid();
   ASSERT(m_years > 0); 
   ASSERT(m_years < 105);
}

Ein weiteres Beispiel finden Sie unter AfxDoForAllObjects.

CObject::CObject

Diese Funktionen sind die Standardkonstruktoren CObject .

CObject();
CObject(const CObject& objectSrc);

Parameter

objectSrc
Ein Verweis auf einen anderen CObject

Hinweise

Die Standardversion wird automatisch vom Konstruktor Ihrer abgeleiteten Klasse aufgerufen.

Wenn Ihre Klasse serialisierbar ist (sie enthält das IMPLEMENT_SERIAL Makro), benötigen Sie einen Standardkonstruktor (einen Konstruktor ohne Argumente) in der Klassendeklaration. Wenn Sie keinen Standardkonstruktor benötigen, deklarieren Sie einen privaten oder geschützten "leeren" Konstruktor. Weitere Informationen finden Sie unter Verwenden von CObject.

Der Standardkopierkonstruktor der C++-Standardklasse führt eine Member-by-Member-Kopie durch. Das Vorhandensein des privaten CObject Kopierkonstruktors garantiert eine Compilerfehlermeldung, wenn der Kopierkonstruktor Ihrer Klasse benötigt wird, aber nicht verfügbar ist. Geben Sie einen Kopierkonstruktor an, wenn ihre Klasse diese Funktion erfordert.

Beispiel

Eine Auflistung der in den CAge Beispielen verwendeten CObject Klasse finden Sie CObList::CObList unter .

// Create a CAge object using the default constructor.
CAge age1;

// Create a CAge object using the copy constructor.
CAge age2(age1);

CObject::Dump

Dumpt den Inhalt des -Objekts in ein - CDumpContext Objekt.

virtual void Dump(CDumpContext& dc) const;

Parameter

dc
Der Diagnoseabbildkontext für das Abbilden, in der Regel afxDump.

Hinweise

Wenn Sie Eine eigene Klasse schreiben, sollten Sie die Dump -Funktion überschreiben, um Diagnosedienste für sich selbst und andere Benutzer Ihrer Klasse bereitzustellen. Der überschriebene Dump ruft in der Regel die Dump Funktion seiner Basisklasse auf, bevor datenmember gedruckt werden, die für die abgeleitete Klasse eindeutig sind. CObject::Dumpgibt den Klassennamen aus, wenn ihre Klasse das -Makro oder IMPLEMENT_SERIAL das IMPLEMENT_DYNAMIC -Makro verwendet.

Hinweis

Ihre Dump Funktion sollte am Ende der Ausgabe kein Neulinienzeichen ausgeben.

Dump -Aufrufe sind nur in der Debugversion des Microsoft Foundation Class-Bibliothek sinnvoll. Sie sollten Aufrufe, Funktionsdeklarationen und Funktionsimplementierungen mit #ifdef _DEBUG, #endif -Anweisungen für die bedingte Kompilierung in Klammern klammern.

Da Dump eine const Funktion ist, dürfen Sie den Objektzustand während des Speicherabbilds nicht ändern.

Der CDumpContext Einfügeoperator (<<) ruft auf Dump , wenn ein CObject Zeiger eingefügt wird.

Dump lässt nur das "azyklische" Abdumping von Objekten zu. Sie können z. B. eine Liste von -Objekten abspeichern, aber wenn eines der Objekte die Liste selbst ist, wird der Stapel letztendlich überlaufen.

Beispiel

Eine Auflistung der CAge in allen CObject Beispielen verwendeten Klasse finden Sie CObList::CObList unter .

void CAge::Dump(CDumpContext& dc) const
{
   CObject::Dump(dc);
   dc << _T("Age = ") << m_years;
}

CObject::GetRuntimeClass

Gibt die -Struktur zurück, die CRuntimeClass der -Klasse dieses Objekts entspricht.

virtual CRuntimeClass* GetRuntimeClass() const;

Rückgabewert

Ein Zeiger auf die -Struktur, die CRuntimeClass der -Klasse dieses Objekts entspricht, nie NULL.

Hinweise

Es gibt eine CRuntimeClass Struktur für jede CObjectvon abgeleitete Klasse. Die Strukturmember sind wie folgt:

  • LPCSTR m_lpszClassName Eine auf NULL endende Zeichenfolge, die den ASCII-Klassennamen enthält.

  • int m_nObjectSize Die Größe des -Objekts in Bytes. Wenn das Objekt Datenmember enthält, die auf zugeordneten Arbeitsspeicher zeigen, wird die Größe dieses Arbeitsspeichers nicht eingeschlossen.

  • UINT m_wSchema Die Schemanummer ( -1 für nicht erializierbare Klassen). Eine Beschreibung der Schemanummer finden Sie im IMPLEMENT_SERIAL Makro.

  • CObject* (PASCAL* m_pfnCreateObject)() Ein Funktionszeiger auf den Standardkonstruktor, der ein Objekt Ihrer Klasse erstellt (nur gültig, wenn die Klasse die dynamische Erstellung unterstützt; andernfalls wird zurückgegeben NULL).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() Wenn Ihre Anwendung dynamisch mit der AFXDLL-Version von MFC verknüpft ist, ein Zeiger auf eine Funktion, die die CRuntimeClass Struktur der Basisklasse zurückgibt.

  • CRuntimeClass* m_pBaseClass Wenn Ihre Anwendung statisch mit MFC verknüpft ist, ein Zeiger auf die CRuntimeClass Struktur der Basisklasse.

Diese Funktion erfordert die Verwendung des IMPLEMENT_DYNAMICMakros , IMPLEMENT_DYNCREATEoder IMPLEMENT_SERIAL in der Klassenimplementierungen. Andernfalls erhalten Sie falsche Ergebnisse.

Beispiel

Eine Auflistung der CAge in allen CObject Beispielen verwendeten Klasse finden Sie CObList::CObList unter .

CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

CObject::IsKindOf

Testet die Beziehung dieses Objekts zu einer bestimmten Klasse.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

Parameter

pClass
Ein Zeiger auf eine CRuntimeClass Struktur, die Ihrer CObjectvon abgeleiteten Klasse zugeordnet ist.

Rückgabewert

Ungleich 0 (null), wenn das -Objekt der -Klasse entspricht; andernfalls 0.

Hinweise

Diese Funktion testet pClass , ob (1) es sich um ein Objekt der angegebenen Klasse oder (2) um ein Objekt einer klasse handelt, die von der angegebenen Klasse abgeleitet wurde. Diese Funktion funktioniert nur für Klassen, die mit dem DECLARE_DYNAMICMakro , DECLARE_DYNCREATEoder DECLARE_SERIAL deklariert wurden.

Verwenden Sie diese Funktion nicht umfassend, da sie das C++-Polymorphiefeature vereiteelt. Verwenden Sie stattdessen virtuelle Funktionen.

Beispiel

Eine Auflistung der CAge in allen CObject Beispielen verwendeten Klasse finden Sie CObList::CObList unter .

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

Testet, ob dieses Objekt für die Serialisierung geeignet ist.

BOOL IsSerializable() const;

Rückgabewert

Ungleich 0 (null), wenn dieses Objekt serialisiert werden kann. andernfalls 0.

Hinweise

Damit eine Klasse serialisierbar ist, muss ihre Deklaration das DECLARE_SERIAL Makro enthalten, und die Implementierung muss das IMPLEMENT_SERIAL Makro enthalten.

Hinweis

Überschreiben Sie diese Funktion nicht.

Beispiel

Eine Auflistung der CAge in allen CObject Beispielen verwendeten Klasse finden Sie CObList::CObList unter .

CAge a(21);
ASSERT(a.IsSerializable());

CObject::operator delete

Für die Releaseversion der Bibliothek gibt der Operator delete den vom Operator newbelegten Arbeitsspeicher frei.

void PASCAL operator delete(void* p);

void PASCAL operator delete(
    void* p,
    void* pPlace);

void PASCAL operator delete(
    void* p,
    LPCSTR lpszFileName,
    int nLine);

Hinweise

In der Debugversion nimmt der Operator delete an einem Zuordnungsüberwachungsschema teil, das zur Erkennung von Speicherverlusten entwickelt wurde.

Wenn Sie die Codezeile verwenden

#define new DEBUG_NEW

vor einer Ihrer Implementierungen in einem . CPP-Datei, dann wird die dritte Version von delete verwendet, wobei der Dateiname und die Zeilennummer im zugeordneten Block für die spätere Berichterstellung gespeichert werden. Sie müssen sich keine Gedanken über die Bereitstellung der zusätzlichen Parameter machen. ein Makro übernimmt dies für Sie.

Auch wenn Sie nicht im Debugmodus verwenden DEBUG_NEW , erhalten Sie weiterhin die Erkennung von Lecks, jedoch ohne die oben beschriebene Quelldatei-Zeilennummernberichterstattung.

Wenn Sie Operatoren new und deleteüberschreiben, verfällt diese Diagnosefunktion.

Beispiel

Eine Auflistung der in den CAge Beispielen verwendeten CObject Klasse finden Sie CObList::CObList unter .

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

Für die Releaseversion der Bibliothek führt der Operator new eine optimale Speicherbelegung ähnlich wie aus 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);

Hinweise

In der Debugversion nimmt der Operator new an einem Zuordnungsüberwachungsschema teil, das zur Erkennung von Speicherverlusten entwickelt wurde.

Wenn Sie die Codezeile verwenden

#define new DEBUG_NEW

vor einer Ihrer Implementierungen in einem . CPP-Datei, dann wird die zweite Version von new verwendet, wobei der Dateiname und die Zeilennummer im zugeordneten Block für die spätere Berichterstellung gespeichert werden. Sie müssen sich keine Gedanken über die Bereitstellung der zusätzlichen Parameter machen. ein Makro übernimmt dies für Sie.

Auch wenn Sie nicht im Debugmodus verwenden DEBUG_NEW , erhalten Sie weiterhin die Erkennung von Lecks, jedoch ohne die oben beschriebene Quelldatei-Zeilennummernberichterstattung.

Hinweis

Wenn Sie diesen Operator überschreiben, müssen Sie auch überschreiben delete. Verwenden Sie nicht die Standardbibliotheksfunktion _new_handler .

Beispiel

Eine Auflistung der in den CAge Beispielen verwendeten CObject Klasse finden Sie CObList::CObList unter .

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

Liest oder schreibt dieses Objekt aus einem oder in ein Archiv.

virtual void Serialize(CArchive& ar);

Parameter

ar
Ein CArchive -Objekt, in das oder aus dem serialisiert werden soll.

Hinweise

Überschreiben Sie Serialize für jede Klasse, die Sie serialisieren möchten. Der überschriebene Serialize muss zuerst die Serialize Funktion seiner Basisklasse aufrufen.

Sie müssen auch das Makro in der DECLARE_SERIAL Klassendeklaration verwenden, und Sie müssen das IMPLEMENT_SERIAL Makro in der Implementierung verwenden.

Verwenden Sie CArchive::IsLoading oder CArchive::IsStoring , um zu bestimmen, ob das Archiv geladen oder gespeichert wird.

Serialize wird von CArchive::ReadObject und CArchive::WriteObjectaufgerufen. Diese Funktionen sind dem Einfügeoperator ( <<) und dem CArchive Extraktionsoperator ( >>) zugeordnet.

Beispiele für die Serialisierung finden Sie im Artikel Serialisieren eines Objekts.

Beispiel

Eine Auflistung der CAge in allen CObject Beispielen verwendeten Klasse finden Sie CObList::CObList unter .

void CAge::Serialize(CArchive& ar)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())
      ar << m_years;
   else
      ar >> m_years;
}

Weitere Informationen

Hierarchiediagramm