CObject
Třída
Hlavní základní třída knihovny tříd Microsoft Foundation.
Syntaxe
class AFX_NOVTABLE CObject
Členové
Chráněné konstruktory
Název | Popis |
---|---|
CObject::CObject |
Výchozí konstruktor. |
Veřejné metody
Název | Popis |
---|---|
CObject::AssertValid |
Ověří integritu tohoto objektu. |
CObject::Dump |
Vytvoří diagnostický výpis tohoto objektu. |
CObject::GetRuntimeClass |
CRuntimeClass Vrátí strukturu odpovídající třídě tohoto objektu. |
CObject::IsKindOf |
Otestuje relaci tohoto objektu s danou třídou. |
CObject::IsSerializable |
Testuje, zda lze tento objekt serializovat. |
CObject::Serialize |
Načte nebo uloží objekt z/do archivu. |
Veřejné operátory
Název | Popis |
---|---|
CObject::operator delete |
Speciální delete operátor. |
CObject::operator new |
Speciální new operátor. |
Poznámky
Slouží jako kořen nejen pro třídy knihovny, jako CFile
jsou a CObList
, ale také pro třídy, které píšete. CObject
poskytuje základní služby, včetně
- Podpora serializace
- Informace o třídě za běhu
- Výstup diagnostiky objektů
- Kompatibilita s třídami kolekce
CObject
nepodporuje více dědičnosti. Odvozené třídy můžou mít pouze jednu CObject
základní třídu a musí CObject
být úplně vlevo v hierarchii. Je však přípustné mít struktury a ne CObject
- odvozené třídy v pravých větvích vícenásobné dědičnosti.
Pokud ve své implementaci a deklarací třídy použijete některá volitelná makra, získáte z odvození významné výhody CObject
.
Makra první úrovně DECLARE_DYNAMIC
a IMPLEMENT_DYNAMIC
umožňují přístup za běhu k názvu třídy a jeho pozici v hierarchii. To zase umožňuje smysluplné diagnostické dumpingy.
Makra druhé úrovně a IMPLEMENT_SERIAL
zahrnují všechny funkce maker první úrovně DECLARE_SERIAL
a umožňují objekt "serializovat" do a z "archivu".
Informace o odvození tříd Microsoft Foundation a tříd jazyka C++ obecně a použití CObject
naleznete v tématu Použití objektu CObject a serializace.
Hierarchie dědičnosti
CObject
Požadavky
Záhlaví: afx.h
CObject::AssertValid
Ověří integritu tohoto objektu.
virtual void AssertValid() const;
Poznámky
AssertValid
provádí kontrolu platnosti tohoto objektu kontrolou jeho interního stavu. Ve verzi ladění knihovny může aplikace uplatnit a ukončit program se zprávou, která obsahuje číslo řádku a název souboru, AssertValid
kde kontrolní výraz selhal.
Při psaní vlastní třídy byste měli funkci přepsat AssertValid
tak, aby poskytovala diagnostické služby pro sebe a další uživatele vaší třídy. Přepsání AssertValid
obvykle volá AssertValid
funkci své základní třídy před kontrolou datových členů jedinečných pro odvozenou třídu.
Vzhledem k tomu AssertValid
, že je const
funkce, není možné změnit stav objektu během testu. Vlastní odvozené funkce třídy AssertValid
by neměly vyvolat výjimky, ale spíše by měly určit, zda detekují neplatná data objektu.
Definice "platnosti" závisí na třídě objektu. Funkce by měla zpravidla provádět "mělké kontroly". To znamená, že pokud objekt obsahuje ukazatele na jiné objekty, měl by zkontrolovat, zda ukazatele nejsou NULL
, ale neměl by provádět testování platnosti na objektech odkazovaných ukazateli.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité ve všech CObject
příkladech.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Další příklad najdete v tématu AfxDoForAllObjects
.
CObject::CObject
Tyto funkce jsou standardními CObject
konstruktory.
CObject();
CObject(const CObject& objectSrc);
Parametry
objectSrc
Odkaz na jiný CObject
Poznámky
Výchozí verze je automaticky volána konstruktorem vaší odvozené třídy.
Pokud je vaše třída serializovatelná (obsahuje IMPLEMENT_SERIAL
makro), musíte mít výchozí konstruktor (konstruktor bez argumentů) v deklaraci třídy. Pokud nepotřebujete výchozí konstruktor, deklarujte privátní nebo chráněný "prázdný" konstruktor. Další informace naleznete v tématu Použití CObject
.
Standardní konstruktor kopírování třídy C++ provede kopii člena po členu. Přítomnost konstruktoru privátní CObject
kopie zaručuje chybovou zprávu kompilátoru, pokud je potřeba konstruktor kopírování vaší třídy, ale není k dispozici. Pokud vaše třída tuto funkci vyžaduje, zadejte konstruktor kopírování.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité v příkladech CObject
.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Vypíše obsah objektu do objektu CDumpContext
.
virtual void Dump(CDumpContext& dc) const;
Parametry
dc
Kontext výpisu paměti diagnostiky pro dumping, obvykle afxDump
.
Poznámky
Při psaní vlastní třídy byste měli funkci přepsat Dump
tak, aby poskytovala diagnostické služby pro sebe a další uživatele vaší třídy. Přepsání Dump
obvykle volá Dump
funkci své základní třídy před tiskem datových členů jedinečných pro odvozenou třídu. CObject::Dump
vytiskne název třídy, pokud vaše třída používá IMPLEMENT_DYNAMIC
makro.IMPLEMENT_SERIAL
Poznámka:
Funkce Dump
by neměla tisknout znak nového řádku na konci výstupu.
Dump
volání mají smysl pouze v ladicí verzi knihovny tříd Microsoft Foundation. Volání, deklarace funkcí a implementace #ifdef _DEBUG
#endif
funkcí byste měli závorkami použít příkazy pro podmíněnou kompilaci.
Vzhledem k tomu Dump
, že je const
funkce, není možné změnit stav objektu během výpisu paměti.
Operátor CDumpContext
vložení (<<) volá Dump
při CObject
vložení ukazatele.
Dump
povoluje pouze "acyklický" dumping objektů. Můžete například vypsat seznam objektů, ale pokud je jedním z objektů samotný seznam, nakonec zásobník přetečete.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité ve všech CObject
příkladech.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
CRuntimeClass
Vrátí strukturu odpovídající třídě tohoto objektu.
virtual CRuntimeClass* GetRuntimeClass() const;
Návratová hodnota
Ukazatel na CRuntimeClass
strukturu odpovídající třídě tohoto objektu; nikdy NULL
.
Poznámky
Pro každou CObject
odvozenou třídu existuje jedna CRuntimeClass
struktura. Členy struktury jsou následující:
LPCSTR m_lpszClassName
Řetězec ukončený hodnotou null obsahující název třídy ASCII.int m_nObjectSize
Velikost objektu v bajtech. Pokud má objekt datové členy, které odkazují na přidělenou paměť, velikost této paměti není zahrnuta.UINT m_wSchema
Číslo schématu ( -1 pro nonserializable třídy). Popis čísla schématu najdete vIMPLEMENT_SERIAL
makrech.CObject* (PASCAL* m_pfnCreateObject)()
Ukazatel funkce na výchozí konstruktor, který vytvoří objekt vaší třídy (platný pouze v případě, že třída podporuje dynamické vytvoření; jinak vrátíNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Pokud je vaše aplikace dynamicky propojena s verzí AFXDLL mfc, ukazatel na funkci, která vracíCRuntimeClass
strukturu základní třídy.CRuntimeClass* m_pBaseClass
Pokud je vaše aplikace staticky propojená s mfc, ukazatel naCRuntimeClass
strukturu základní třídy.
Tato funkce vyžaduje použití IMPLEMENT_DYNAMIC
IMPLEMENT_DYNCREATE
, nebo IMPLEMENT_SERIAL
makra v implementaci třídy. V opačném případě se zobrazí nesprávné výsledky.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité ve všech CObject
příkladech.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Otestuje relaci tohoto objektu s danou třídou.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Parametry
pClass
Ukazatel na strukturu přidruženou CRuntimeClass
k vaší CObject
-odvozené třídě.
Návratová hodnota
Nenulové, pokud objekt odpovídá třídě; jinak 0.
Poznámky
Tato funkce testuje pClass
, zda (1) je objektem zadané třídy nebo (2) je objektem třídy odvozené ze zadané třídy. Tato funkce funguje pouze pro třídy deklarované pomocí DECLARE_DYNAMIC
, DECLARE_DYNCREATE
nebo DECLARE_SERIAL
makra.
Tuto funkci nepoužívejte široce, protože porazí funkci polymorfismu jazyka C++. Místo toho používejte virtuální funkce.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité ve všech CObject
příkladech.
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
Testuje, zda je tento objekt způsobilý pro serializaci.
BOOL IsSerializable() const;
Návratová hodnota
Nenulové, pokud lze tento objekt serializovat; jinak 0.
Poznámky
Aby byla třída serializovatelná, musí její deklarace obsahovat DECLARE_SERIAL
makro a implementace musí obsahovat IMPLEMENT_SERIAL
makro.
Poznámka:
Tuto funkci nepřepište.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité ve všech CObject
příkladech.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Pro verzi vydané knihovny operátor delete
uvolní paměť přidělenou operátorem new
.
void PASCAL operator delete(void* p);
void PASCAL operator delete(
void* p,
void* pPlace);
void PASCAL operator delete(
void* p,
LPCSTR lpszFileName,
int nLine);
Poznámky
Ve verzi Ladění se operátor delete
účastní schématu monitorování přidělení navrženého k detekci nevracení paměti.
Pokud použijete řádek kódu
#define new DEBUG_NEW
před jakoukoli z vašich implementací v nástroji . Použije se třetí verze souboru CPP a uloží název souboru a číslo řádku do přiděleného delete
bloku pro pozdější generování sestav. Nemusíte se starat o poskytování dodatečných parametrů; Makro se o to postará za vás.
I když v režimu ladění nepoužíváte DEBUG_NEW
, stále se zobrazí detekce úniku, ale bez hlášení o počtu řádků zdrojového souboru popsaného výše.
Pokud přepíšete operátory new
a delete
vyhodíte tuto diagnostickou funkci.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité v příkladech 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
U verze vydané knihovny operátor new
provede optimální přidělení paměti způsobem podobným způsobem jako 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);
Poznámky
Ve verzi Ladění se operátor new
účastní schématu monitorování přidělení navrženého k detekci nevracení paměti.
Pokud použijete řádek kódu
#define new DEBUG_NEW
před jakoukoli z vašich implementací v nástroji . Soubor CPP, pak se použije druhá verze new
souboru, uloží název souboru a číslo řádku do přiděleného bloku pro pozdější generování sestav. Nemusíte se starat o poskytování dodatečných parametrů; Makro se o to postará za vás.
I když v režimu ladění nepoužíváte DEBUG_NEW
, stále se zobrazí detekce úniku, ale bez hlášení o počtu řádků zdrojového souboru popsaného výše.
Poznámka:
Pokud tento operátor přepíšete, musíte také přepsat delete
. Nepoužívejte standardní funkci knihovny _new_handler
.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité v příkladech 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
Čte nebo zapisuje tento objekt z archivu nebo do archivu.
virtual void Serialize(CArchive& ar);
Parametry
ar
CArchive
Objekt pro serializaci do nebo z.
Poznámky
Přepsat Serialize
pro každou třídu, kterou chcete serializovat. Serialize
Přepsání musí nejprve volat Serialize
funkci své základní třídy.
Makro musíte také použít DECLARE_SERIAL
v deklaraci třídy a makro musíte použít IMPLEMENT_SERIAL
v implementaci.
Použijte CArchive::IsLoading
nebo CArchive::IsStoring
určete, jestli se archiv načítá nebo ukládá.
Serialize
je volána a CArchive::ReadObject
CArchive::WriteObject
. Tyto funkce jsou spojeny s operátorem CArchive
vložení ( <<
) a operátorem extrakce ( >>
).
Příklady serializace naleznete v článku Serializace objektu.
Příklad
Podívejte CObList::CObList
se na výpis CAge
třídy použité ve všech CObject
příkladech.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}