Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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_DYNAMICumožň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_SERIALzahrnují 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í CObjectnaleznete 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::Dumpvytiskne 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 CObjectodvozenou 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_nObjectSizeVelikost 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_SERIALmakrech.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íCRuntimeClassstrukturu základní třídy.CRuntimeClass* m_pBaseClassPokud je vaše aplikace staticky propojená s mfc, ukazatel naCRuntimeClassstrukturu základní třídy.
Tato funkce vyžaduje použití IMPLEMENT_DYNAMICIMPLEMENT_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_DYNCREATEnebo 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 deletevyhodí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;
}