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 Der 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 der CRuntimeClass Klasse dieses Objekts entspricht.
CObject::IsKindOf Testet die Beziehung dieses Objekts zu einer bestimmten Klasse.
CObject::IsSerializable Überprüft, ob dieses Objekt serialisiert werden kann.
CObject::Serialize Lädt oder speichert ein Objekt aus/in ein Archiv.

Öffentliche Operatoren

Name Beschreibung
CObject::operator delete Spezialoperator delete .
CObject::operator new Spezialoperator new .

Hinweise

Es 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 Sammlungsklassen

CObject unterstützt keine mehrfache Vererbung. Ihre abgeleiteten Klassen können nur eine CObject Basisklasse aufweisen, die CObject in der Hierarchie ganz links sein muss. Es ist jedoch zulässig, Strukturen und nicht CObjectabgeleitete Klassen in rechtshändigen Vererbungszweigen zu haben.

Wenn Sie einige der optionalen Makros in Ihrer Klassenimplementierung und Deklarationen verwenden, werden Sie wichtige Vorteile von CObject der Ableitung erkennen.

Die Makros DECLARE_DYNAMIC der ersten Ebene und IMPLEMENT_DYNAMIC, ermöglichen den Laufzeitzugriff auf den Klassennamen und seine Position in der Hierarchie. Dies wiederum ermöglicht sinnvolles Diagnosedumping.

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

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

Vererbungshierarchie

CObject

Anforderungen

Headerafx.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 Überprüfen des internen Zustands durch. In der Debugversion der Bibliothek kann das Programm mit einer Meldung bestätigt und beendet werden, AssertValid in der die Zeilennummer und der Dateiname aufgelistet sind, bei denen die Assertion fehlgeschlagen ist.

Wenn Sie Ihre eigene Klasse schreiben, sollten Sie die AssertValid Funktion außer Kraft setzen, um Diagnosedienste für sich und andere Benutzer Ihrer Klasse bereitzustellen. Die Außerkraftsetzung AssertValid ruft in der Regel die AssertValid Funktion der Basisklasse auf, bevor Datenmmber überprüft werden, die für die abgeleitete Klasse eindeutig sind.

Da AssertValid es sich um eine const Funktion handelt, dürfen Sie den Objektzustand während des Tests nicht ändern. Ihre eigenen abgeleiteten Klassenfunktionen AssertValid sollten keine Ausnahmen auslösen, sondern stattdessen bestätigen, ob ungültige Objektdaten erkannt werden.

Die Definition von "Gültigkeit" hängt von der Klasse des Objekts ab. In der Regel sollte die Funktion eine "flache Prüfung" ausführen. Das heißt, wenn ein Objekt Zeiger auf andere Objekte enthält, sollte überprüft werden, ob die Zeiger nicht NULLvorhanden sind, aber es sollte keine Gültigkeitsprüfung der Objekte durchführen, auf die von den Zeigern verwiesen wird.

Beispiel

Eine Auflistung der klasse, die in allen Beispielen verwendet wird, finden Sie unter.See CObList::CObList for a listing of the CAge class used in all CObject examples.

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 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), müssen Sie einen Standardkonstruktor (einen Konstruktor ohne Argumente) in der Klassendeklaration haben. Wenn Sie keinen Standardkonstruktor benötigen, deklarieren Sie einen privaten oder geschützten "leeren" Konstruktor. Weitere Informationen finden Sie unter Verwenden CObject.

Der standardmäßige C++-Standardklassenkopie-Konstruktor führt eine Member-nach-Member-Kopie durch. Das Vorhandensein des privaten CObject Kopierkonstruktors garantiert eine Compilerfehlermeldung, wenn der Kopierkonstruktor Ihrer Klasse erforderlich, aber nicht verfügbar ist. Stellen Sie einen Kopierkonstruktor bereit, wenn ihre Klasse diese Funktion erfordert.

Beispiel

Eine Auflistung der in den Beispielen verwendeten Klasse finden Sie unter.See CObList::CObList for a listing of the CAge class used in the CObject examples.

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

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

CObject::Dump

Dumps the contents of your object to a CDumpContext object.

virtual void Dump(CDumpContext& dc) const;

Parameter

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

Hinweise

Wenn Sie Ihre eigene Klasse schreiben, sollten Sie die Dump Funktion außer Kraft setzen, um Diagnosedienste für sich und andere Benutzer Ihrer Klasse bereitzustellen. Die Außerkraftsetzung Dump ruft in der Regel die Dump Funktion ihrer Basisklasse auf, bevor Datenmmber gedruckt werden, die für die abgeleitete Klasse eindeutig sind. CObject::Dumpdruckt den Klassennamen, wenn die Klasse das Makro oder IMPLEMENT_SERIAL das IMPLEMENT_DYNAMIC Makro verwendet.

Hinweis

Ihre Dump Funktion sollte kein Neuzeilenzeichen am Ende der Ausgabe drucken.

Dump Aufrufe sind nur in der Debugversion der Microsoft Foundation-Klassenbibliothek sinnvoll. Sie sollten Klammernaufrufe, Funktionsdeklarationen und Funktionsimplementierungen mit #ifdef _DEBUG, #endif Anweisungen für die bedingte Kompilierung verwenden.

Da Dump es sich um eine const Funktion handelt, dürfen Sie den Objektzustand während des Dumps nicht ändern.

Der CDumpContext Einfügeoperator wird<< aufgerufenDump, wenn ein CObject Zeiger eingefügt wird.

Dump erlaubt nur "azyklisches" Dumping von Gegenständen. Sie können z. B. eine Liste von Objekten abbilden, aber wenn eines der Objekte die Liste selbst ist, überlaufen Sie schließlich den Stapel.

Beispiel

Eine Auflistung der klasse, die in allen Beispielen verwendet wird, finden Sie unter.See CObList::CObList for a listing of the CAge class used in all CObject examples.

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

CObject::GetRuntimeClass

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

virtual CRuntimeClass* GetRuntimeClass() const;

Rückgabewert

Ein Zeiger auf die Struktur, die der CRuntimeClass Klasse dieses Objekts entspricht; niemals NULL.

Hinweise

Für jede CObjectabgeleitete Klasse gibt es eine CRuntimeClass Struktur. Die Strukturmmber sind wie folgt:

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

  • int m_nObjectSize Die Größe des Objekts in Byte. Wenn das Objekt Datenmmber enthält, die auf den zugewiesenen Speicher verweisen, ist die Größe dieses Speichers nicht enthalten.

  • UINT m_wSchema Die Schemanummer ( -1 für nicht ialisierbare 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 (gilt nur, 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, wird ein Zeiger auf eine Funktion zurückgegeben, die die CRuntimeClass Struktur der Basisklasse zurückgibt.

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

Für diese Funktion ist die Verwendung des IMPLEMENT_DYNAMICIMPLEMENT_DYNCREATEKlassenimplementierungs- oder IMPLEMENT_SERIAL Makros erforderlich. Andernfalls erhalten Sie falsche Ergebnisse.

Beispiel

Eine Auflistung der klasse, die in allen Beispielen verwendet wird, finden Sie unter.See CObList::CObList for a listing of the CAge class used in all CObject examples.

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 CObjectabgeleiteten Klasse zugeordnet ist.

Rückgabewert

Nonzero, wenn das Objekt der Klasse entspricht; andernfalls 0.

Hinweise

Diese Funktion prüft pClass , ob (1) es sich um ein Objekt der angegebenen Klasse handelt oder (2) es sich um ein Objekt einer Von der angegebenen Klasse abgeleiteten Klasse handelt. Diese Funktion funktioniert nur für Klassen, die mit dem DECLARE_DYNAMIC, DECLARE_DYNCREATEoder DECLARE_SERIAL dem Makro deklariert sind.

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

Beispiel

Eine Auflistung der klasse, die in allen Beispielen verwendet wird, finden Sie unter.See CObList::CObList for a listing of the CAge class used in all CObject examples.

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 berechtigt ist.

BOOL IsSerializable() const;

Rückgabewert

Nonzero, wenn dieses Objekt serialisiert werden kann; andernfalls 0.

Hinweise

Damit eine Klasse serialisierbar ist, muss die 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 klasse, die in allen Beispielen verwendet wird, finden Sie unter.See CObList::CObList for a listing of the CAge class used in all CObject examples.

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

CObject::operator delete

Für die Release-Version der Bibliothek gibt der Operator delete den vom Operator newzugewiesenen Speicher 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 zum Erkennen von Speicherlecks dient.

Wenn Sie die Codezeile verwenden

#define new DEBUG_NEW

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

Auch wenn Sie den Debugmodus nicht verwenden DEBUG_NEW , erhalten Sie trotzdem die Leckerkennung, aber ohne die oben beschriebene Berichterstellung der Quelldateizeile.

Wenn Sie Operatoren new außer Kraft setzen und deletediese Diagnosefunktion außer Kraft setzen.

Beispiel

Eine Auflistung der in den Beispielen verwendeten Klasse finden Sie unter.See CObList::CObList for a listing of the CAge class used in the CObject examples.

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 Release-Version der Bibliothek führt der Operator new eine optimale Speicherzuordnung auf ähnliche Weise durch 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 zum Erkennen von Speicherlecks dient.

Wenn Sie die Codezeile verwenden

#define new DEBUG_NEW

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

Auch wenn Sie den Debugmodus nicht verwenden DEBUG_NEW , erhalten Sie trotzdem die Leckerkennung, aber ohne die oben beschriebene Berichterstellung der Quelldateizeile.

Hinweis

Wenn Sie diesen Operator außer Kraft setzen, müssen Sie auch außer Kraft setzen delete. Verwenden Sie nicht die Standardbibliotheksfunktion _new_handler .

Beispiel

Eine Auflistung der in den Beispielen verwendeten Klasse finden Sie unter.See CObList::CObList for a listing of the CAge class used in the CObject examples.

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 von dem serialisiert werden soll.

Hinweise

Überschreiben Serialize Sie für jede Klasse, die Sie serialisieren möchten. Die Außerkraftsetzung Serialize muss zuerst die Serialize Funktion der 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 oder CArchive::IsStoring bestimmen SieCArchive::IsLoading, ob das Archiv geladen oder gespeichert wird.

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

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

Beispiel

Eine Auflistung der klasse, die in allen Beispielen verwendet wird, finden Sie unter.See CObList::CObList for a listing of the CAge class used in all CObject examples.

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

Siehe auch

Hierarchiediagramm