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 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 DECLARE_DYNAMIC
der ersten Ebene und IMPLEMENT_DYNAMIC
ermö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_SERIAL
IMPLEMENT_SERIAL
enthalten 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 CObject
finden 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 NULL
sind, 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::Dump
gibt 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 CObject
von 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 imIMPLEMENT_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ückgegebenNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Wenn Ihre Anwendung dynamisch mit der AFXDLL-Version von MFC verknüpft ist, ein Zeiger auf eine Funktion, die dieCRuntimeClass
Struktur der Basisklasse zurückgibt.CRuntimeClass* m_pBaseClass
Wenn Ihre Anwendung statisch mit MFC verknüpft ist, ein Zeiger auf dieCRuntimeClass
Struktur der Basisklasse.
Diese Funktion erfordert die Verwendung des IMPLEMENT_DYNAMIC
Makros , IMPLEMENT_DYNCREATE
oder 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 CObject
von 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_DYNAMIC
Makro , DECLARE_DYNCREATE
oder 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 new
belegten 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::WriteObject
aufgerufen. 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;
}