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 CObject
abgeleitete 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 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 Ü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 NULL
vorhanden 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::Dump
druckt 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 CObject
abgeleitete 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 imIMPLEMENT_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ückgegebenNULL
).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 dieCRuntimeClass
Struktur der Basisklasse zurückgibt.CRuntimeClass* m_pBaseClass
Wenn Die Anwendung statisch mit MFC verknüpft ist, zeigt ein Zeiger auf dieCRuntimeClass
Struktur der Basisklasse.
Für diese Funktion ist die Verwendung des IMPLEMENT_DYNAMIC
IMPLEMENT_DYNCREATE
Klassenimplementierungs- 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 CObject
abgeleiteten 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_DYNCREATE
oder 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 new
zugewiesenen 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 delete
diese 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;
}