Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
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 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_lpszClassNameEine mit Null beendete Zeichenfolge, die den ASCII-Klassennamen enthält.int m_nObjectSizeDie 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_wSchemaDie Schemanummer ( -1 für nicht ialisierbare Klassen). Eine Beschreibung der Schemanummer finden Sie imIMPLEMENT_SERIALMakro.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 dieCRuntimeClassStruktur der Basisklasse zurückgibt.CRuntimeClass* m_pBaseClassWenn Die Anwendung statisch mit MFC verknüpft ist, zeigt ein Zeiger auf dieCRuntimeClassStruktur 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;
}