Share via


CObject Třída

Hlavní základní třída knihovny tříd Microsoft Foundation.

Syntaxe

class AFX_NOVTABLE CObject

Členové

Chráněné konstruktory

Jméno popis
CObject::CObject Výchozí konstruktor.

Veřejné metody

Jméno 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

Jméno 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;

Vrácená 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_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 v IMPLEMENT_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 na CRuntimeClass strukturu 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ě.

Vrácená 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;

Vrácená 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::ReadObjectCArchive::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;
}

Viz také

Graf hierarchie