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 CRuntimeClass -Struktur zurück, die 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 , sondern auch für die CObList 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, die CObject in der Hierarchie ganz links liegen muss. Es ist jedoch zulässig, Strukturen und nicht CObject abgeleitete 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 der ersten Ebene , und , ermöglichen den Laufzeitzugriff auf den Klassennamen DECLARE_DYNAMIC und seine Position in der IMPLEMENT_DYNAMIC Hierarchie. Dies ermöglicht wiederum ein sinnvolles Diagnosedumping.

Die Makros der zweiten Ebene, und , enthalten alle Funktionen der Makros der ersten Ebene und ermöglichen das "Serialisieren" eines Objekts in ein und aus einem DECLARE_SERIAL IMPLEMENT_SERIAL "Archiv".

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

Vererbungshierarchie

CObject

Requirements (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 sein interner Zustand überprüft wird. In der Debugversion der Bibliothek kann das Programm mit einer Meldung, die die Zeilennummer und den Dateinamen auflistet, bei denen die Assertion fehlgeschlagen ist, durchsetzen und dann AssertValid beenden.

Wenn Sie eine eigene Klasse schreiben, sollten Sie die Funktion überschreiben, um Diagnosedienste für sich selbst und andere AssertValid Benutzer Ihrer Klasse zur Verfügung zu stellen. Das überschriebene AssertValid ruft in der Regel die -Funktion seiner Basisklasse auf, bevor daten member überprüft AssertValid werden, die für die abgeleitete Klasse eindeutig sind.

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

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

Beispiel

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

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 CObject Standardkonstruktoren.

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

Parameter

objectSrc
Ein Verweis auf eine andere 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 CObList::CObList Auflistung der CAge in den Beispielen verwendeten Klasse finden Sie unter CObject .

// 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 einem CDumpContext -Objekt.

virtual void Dump(CDumpContext& dc) const;

Parameter

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

Hinweise

Wenn Sie Ihre eigene Klasse schreiben, sollten Sie die -Funktion überschreiben, Dump um Diagnosedienste für sich selbst und andere Benutzer Ihrer Klasse bereitzustellen. Der überschriebene Dump ruft in der Regel die Funktion seiner Dump Basisklasse auf, bevor datenmember gedruckt werden, die für die abgeleitete Klasse eindeutig sind. CObject::Dump gibt den Klassennamen aus, wenn ihre Klasse das -Makro oder das IMPLEMENT_DYNAMIC IMPLEMENT_SERIAL -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 Dump auf, 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 CObList::CObList Auflistung der CAge in allen Beispielen verwendeten Klasse finden Sie unter CObject .

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

CObject::GetRuntimeClass

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

virtual CRuntimeClass* GetRuntimeClass() const;

Rückgabewert

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

Hinweise

Es gibt eine CRuntimeClass -Struktur für jede CObject von abgeleitete Klasse. Die Strukturmitglieder lauten wie folgt:

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

  • int m_nObjectSize Die Größe des Objekts in Bytes. Wenn das Objekt über Datenmitglieder verfügt, die auf zugeordneten Arbeitsspeicher verweisen, wird die Größe dieses Arbeitsspeichers nicht eingeschlossen.

  • UINT m_wSchema Die Schemanummer ( -1 für nichterializierbare Klassen). Eine Beschreibung IMPLEMENT_SERIAL der Schemanummer finden Sie im 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 NULL zurückgegeben).

  • 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 Struktur der CRuntimeClass 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_DYNAMIC IMPLEMENT_DYNCREATE Makros , oder IMPLEMENT_SERIAL in der Klassenimplementierung. Andernfalls erhalten Sie falsche Ergebnisse.

Beispiel

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

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

CObject::IsKindOf

Testet die Beziehung dieses Objekts zu einer angegebenen Klasse.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

Parameter

pClass
Ein Zeiger auf eine Struktur, CRuntimeClass die ihrer von abgeleiteten Klasse zugeordnet CObject ist.

Rückgabewert

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

Hinweise

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

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

Beispiel

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

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 CObList::CObList Auflistung der CAge in allen Beispielen verwendeten Klasse finden Sie unter CObject .

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

CObject::operator delete

Für die Releaseversion der Bibliothek gibt der Operator delete den vom Operator belegten Arbeitsspeicher new 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, erhalten Sie weiterhin die Erkennung von DEBUG_NEW Lecks, jedoch ohne die oben beschriebene Quelldatei-Zeilennummernberichterstattung.

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

Beispiel

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

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 malloc aus.

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, erhalten Sie weiterhin die Erkennung von Lecks, aber ohne die oben beschriebene Berichterstellung der DEBUG_NEW Quelldateizeilennummer.

Hinweis

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

Beispiel

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

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, das in oder aus serialisiert werden soll.

Hinweise

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

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

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

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

Serialisierungsbeispiele finden Sie im Artikel Serialisieren eines Objekts.

Beispiel

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

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

Weitere Informationen

Hierarchiediagramm