Megosztás a következőn keresztül:


CObject osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

A Microsoft Foundation osztálytár fő alaposztálya.

Szemantika

class AFX_NOVTABLE CObject

Tagok

Védett konstruktorok

Név Description
CObject::CObject Alapértelmezett konstruktor.

Nyilvános metódusok

Név Description
CObject::AssertValid Ellenőrzi az objektum integritását.
CObject::Dump Diagnosztikai memóriaképet hoz létre az objektumról.
CObject::GetRuntimeClass CRuntimeClass Az objektum osztályának megfelelő struktúrát adja vissza.
CObject::IsKindOf Teszteli az objektum egy adott osztályhoz való viszonyát.
CObject::IsSerializable Teszteli, hogy ez az objektum szerializálható-e.
CObject::Serialize Betölt vagy tárol egy objektumot egy archívumból vagy egy archívumba.

Nyilvános operátorok

Név Description
CObject::operator delete Speciális delete operátor.
CObject::operator new Speciális new operátor.

Megjegyzések

Nem csak az olyan könyvtárosztályok, mint például CFile az és CObList, hanem az ön által írt osztályok esetében is gyökérként szolgál. CObject alapvető szolgáltatásokat nyújt, többek között

  • Szerializálás támogatása
  • Futásidejű osztály adatai
  • Objektumdiagnosztikai kimenet
  • Kompatibilitás gyűjteményosztályokkal

CObject nem támogatja a többszörös öröklést. A származtatott osztályoknak csak egy CObject alaposztályuk lehet, és a CObject hierarchiában a bal szélsőnek kell lenniük. Megengedhető azonban, hogy a jobb oldali többöröklésű ágakban struktúrák és nem CObjectszármaztatott osztályok tartoznak.

Ha az osztály implementációjában és deklarációiban az opcionális makrók némelyikét használja, a származtatás jelentős előnyökkel jár CObject .

Az első szintű makrók és DECLARE_DYNAMICIMPLEMENT_DYNAMICa futtatási idő hozzáférést biztosítanak az osztály nevéhez és a hierarchiában elfoglalt helyéhez. Ez pedig lehetővé teszi a jelentéssel bíró diagnosztikai memóriaképek készítését.

A második szintű makrók, DECLARE_SERIAL valamint IMPLEMENT_SERIALaz első szintű makrók összes funkcióját tartalmazzák, és lehetővé teszik, hogy egy objektum "szerializálva" legyen egy "archívumba".

A Microsoft Foundation-osztályok és a C++ osztályok általános és használatával CObjectkapcsolatos információkért lásd: A CObject és a szerializálás használata.

Öröklési hierarchia

CObject

Requirements

Fejléc:afx.h

CObject::AssertValid

Ellenőrzi az objektum integritását.

virtual void AssertValid() const;

Megjegyzések

AssertValid belső állapotának ellenőrzésével elvégzi az objektum érvényességének ellenőrzését. A kódtár AssertValid hibakeresési verziójában érvényesítheti, majd egy üzenettel leállítja a programot, amely felsorolja a sorszámot és a fájlnevet, ahol az állítás sikertelen volt.

Amikor saját osztályt ír, felül kell bírálnia a függvényt AssertValid , hogy diagnosztikai szolgáltatásokat nyújtson saját magának és az osztály többi felhasználójának. A felülrendelt AssertValid általában meghívja az AssertValid alaposztály függvényét, mielőtt a származtatott osztályra egyedi adattagokat ellenőriz.

Mivel AssertValid ez egy const függvény, a teszt során nem módosíthatja az objektum állapotát. A saját származtatott osztályfüggvényei AssertValid nem kivételeket vethetnek ki, hanem azt kell ellenőrizniük, hogy érvénytelen objektumadatokat észlelnek-e.

Az "érvényesség" definíciója az objektum osztályától függ. Általában a függvénynek "sekély ellenőrzést" kell végeznie. Vagyis ha egy objektum más objektumokra mutató mutatókat tartalmaz, ellenőriznie kell, hogy a mutatók nem NULLtalálhatók-e, de nem szabad érvényességvizsgálatot végeznie a mutatók által hivatkozott objektumokon.

Example

Tekintse meg CObList::CObList az CAge összes CObject példában használt osztály listáját.

void CAge::AssertValid() const
{
   CObject::AssertValid();
   ASSERT(m_years > 0); 
   ASSERT(m_years < 105);
}

Egy másik példa: AfxDoForAllObjects.

CObject::CObject

Ezek a függvények a standard CObject konstruktorok.

CObject();
CObject(const CObject& objectSrc);

Paraméterek

objectSrc
Hivatkozás egy másikra CObject

Megjegyzések

Az alapértelmezett verziót a származtatott osztály konstruktora automatikusan meghívja.

Ha az osztály szerializálható (a makrót is tartalmazza IMPLEMENT_SERIAL ), akkor az osztálydeklarációban alapértelmezett konstruktornak (argumentumok nélküli konstruktornak) kell lennie. Ha nincs szüksége alapértelmezett konstruktorra, deklaráljon egy privát vagy védett "üres" konstruktort. További információt a Használat CObjectcímű témakörben talál.

A standard C++ alapértelmezett osztálypéldány-konstruktor tagonként készít másolatot. A magánpéldány-konstruktor CObject jelenléte garantálja a fordító hibaüzenetét, ha az osztály másoláskonstruktorára szükség van, de nem érhető el. Adjon meg egy példánykonstruktort, ha az osztály megköveteli ezt a képességet.

Example

Tekintse meg CObList::CObList a CAge példákban CObject használt osztály listáját.

// Create a CAge object using the default constructor.
CAge age1;

// Create a CAge object using the copy constructor.
CAge age2(age1);

CObject::Dump

Az objektum tartalmát egy CDumpContext objektumba dobja.

virtual void Dump(CDumpContext& dc) const;

Paraméterek

dc
A memóriakép diagnosztikai környezete általában afxDump.

Megjegyzések

Amikor saját osztályt ír, felül kell bírálnia a függvényt Dump , hogy diagnosztikai szolgáltatásokat nyújtson saját magának és az osztály többi felhasználójának. A felülírt Dump függvény általában meghívja az alaposztály függvényét, Dump mielőtt a származtatott osztályra egyedi adattagokat nyomtat. CObject::DumpKinyomtatja az osztály nevét, ha az osztály a makrót vagy IMPLEMENT_SERIAL a makrót IMPLEMENT_DYNAMIC használja.

Megjegyzés:

A Dump függvény nem nyomtathat újsoros karaktert a kimenet végén.

Dump a hívásoknak csak a Microsoft Foundation osztálykönyvtár hibakeresési verziójában van értelme. Zárójelbe kell tenni a hívásokat, a függvénydeklarációkat és a függvény-implementációkat a #endif feltételes fordításra vonatkozó utasításokkal#ifdef _DEBUG.

Mivel Dump ez egy const függvény, nem módosíthatja az objektum állapotát a memóriakép során.

A CDumpContext beszúrási (<<) operátor meghívja Dump a CObject kurzor beszúrását.

Dump csak az objektumok "aciklikus" memóriaképét teszi lehetővé. Létrehozhat például egy objektumlistát, de ha az egyik objektum maga a lista, akkor végül túlcsordul a verem.

Example

Tekintse meg CObList::CObList az CAge összes CObject példában használt osztály listáját.

void CAge::Dump(CDumpContext& dc) const
{
   CObject::Dump(dc);
   dc << _T("Age = ") << m_years;
}

CObject::GetRuntimeClass

CRuntimeClass Az objektum osztályának megfelelő struktúrát adja vissza.

virtual CRuntimeClass* GetRuntimeClass() const;

Visszaadott érték

Az objektum osztályának megfelelő struktúra mutatójaCRuntimeClass; soha.NULL

Megjegyzések

Minden -CObjectszármaztatott osztályhoz egy CRuntimeClass struktúra tartozik. A struktúra tagjai a következők:

  • LPCSTR m_lpszClassName Az ASCII-osztálynevet tartalmazó null értékű sztring.

  • int m_nObjectSize Az objektum mérete bájtban. Ha az objektumnak vannak olyan adattagok, amelyek a lefoglalt memóriára mutatnak, a memória mérete nem lesz benne.

  • UINT m_wSchema A sémaszám (-1 nemializálható osztályok esetén). A sémaszám leírását a IMPLEMENT_SERIAL makróban talál.

  • CObject* (PASCAL* m_pfnCreateObject)() Az osztály objektumát létrehozó alapértelmezett konstruktorra mutató függvény (csak akkor érvényes, ha az osztály támogatja a dinamikus létrehozást, ellenkező esetben visszaadja NULL).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() Ha az alkalmazás dinamikusan kapcsolódik az MFC AFXDLL-verziójához, egy olyan függvényre mutató mutatót, amely az CRuntimeClass alaposztály szerkezetét adja vissza.

  • CRuntimeClass* m_pBaseClass Ha az alkalmazás statikusan kapcsolódik az MFC-hez, az alaposztály szerkezetére mutató mutató CRuntimeClass .

Ehhez a függvényhez az osztály implementációjában használni kell az IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATEvagy IMPLEMENT_SERIAL makrót. Ellenkező esetben helytelen eredményeket fog kapni.

Example

Tekintse meg CObList::CObList az CAge összes CObject példában használt osztály listáját.

CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

CObject::IsKindOf

Teszteli az objektum egy adott osztályhoz való viszonyát.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

Paraméterek

pClass
A -származtatott osztályhoz CObjecttársított struktúra mutatójaCRuntimeClass.

Visszaadott érték

Nonzero, ha az objektum megfelel az osztálynak; egyéb esetben 0.

Megjegyzések

Ez a függvény ellenőrzi pClass , hogy (1) a megadott osztály objektuma-e, vagy (2) a megadott osztályból származtatott osztály objektuma-e. Ez a függvény csak a DECLARE_DYNAMIC, DECLARE_DYNCREATEvagy DECLARE_SERIAL makróval deklarált osztályok esetében működik.

Ne használja ezt a függvényt széles körben, mert legyőzi a C++ polimorfizmus funkciót. Használjon inkább virtuális függvényeket.

Example

Tekintse meg CObList::CObList az CAge összes CObject példában használt osztály listáját.

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

Ellenőrzi, hogy ez az objektum jogosult-e szerializálásra.

BOOL IsSerializable() const;

Visszaadott érték

Nonzero, ha ez az objektum szerializálható; egyéb esetben 0.

Megjegyzések

Ahhoz, hogy egy osztály szerializálható legyen, deklarációjának tartalmaznia kell a DECLARE_SERIAL makrót, a megvalósításnak pedig tartalmaznia kell a makrót IMPLEMENT_SERIAL .

Megjegyzés:

Ne bírálja felül ezt a függvényt.

Example

Tekintse meg CObList::CObList az CAge összes CObject példában használt osztály listáját.

CAge a(21);
ASSERT(a.IsSerializable());

CObject::operator delete

A kódtár kiadási verziójához az operátor delete felszabadítja az operátor newáltal lefoglalt memóriát.

void PASCAL operator delete(void* p);

void PASCAL operator delete(
    void* p,
    void* pPlace);

void PASCAL operator delete(
    void* p,
    LPCSTR lpszFileName,
    int nLine);

Megjegyzések

A hibakeresési verzióban az operátor delete részt vesz a memóriaszivárgások észlelésére tervezett foglalás-figyelési sémában.

Ha a kódsort használja

#define new DEBUG_NEW

az implementációk bármelyike előtt. A CPP-fájl, majd a harmadik verzió delete lesz használva, amely a fájlnevet és a sorszámot tárolja a lefoglalt blokkban a későbbi jelentéskészítéshez. Nem kell aggódnia a további paraméterek megadása miatt; a makró gondoskodik róla.

Még ha nem is hibakeresési módban használja DEBUG_NEW , továbbra is szivárgásészlelést kap, de a fent leírt forrás-fájl sorszám jelentés nélkül.

Ha felülbírálja az operátorokat new , és deleteelveszíti ezt a diagnosztikai képességet.

Example

Tekintse meg CObList::CObList a CAge példákban CObject használt osztály listáját.

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

A kódtár kiadási verziójához az operátor new az optimális memóriafoglalást a következőhöz mallochasonló módon végzi el.

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);

Megjegyzések

A hibakeresési verzióban az operátor new részt vesz a memóriaszivárgások észlelésére tervezett foglalás-figyelési sémában.

Ha a kódsort használja

#define new DEBUG_NEW

az implementációk bármelyike előtt. A CPP-fájl, majd a második verzió new lesz használva, amely a fájlnevet és a sorszámot tárolja a lefoglalt blokkban a későbbi jelentéskészítéshez. Nem kell aggódnia a további paraméterek megadása miatt; a makró gondoskodik róla.

Még ha nem is hibakeresési módban használja DEBUG_NEW , továbbra is szivárgásészlelést kap, de a fent leírt forrás-fájl sorszám jelentés nélkül.

Megjegyzés:

Ha felülbírálja ezt az operátort, felül kell bírálnia deleteazt is. Ne használja a standard kódtárfüggvényt _new_handler .

Example

Tekintse meg CObList::CObList a CAge példákban CObject használt osztály listáját.

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

Beolvassa vagy beírja ezt az objektumot egy archívumból vagy egy archívumba.

virtual void Serialize(CArchive& ar);

Paraméterek

ar
Egy CArchive objektum, amelyből szerializálható.

Megjegyzések

Felülbírálás Serialize minden szerializálni kívánt osztálynál. A felülírtnak Serialize először meg kell hívnia az Serialize alaposztály függvényét.

A makrót az DECLARE_SERIAL osztálydeklarációban is használnia kell, és a makrót a IMPLEMENT_SERIAL megvalósításban kell használnia.

Az CArchive::IsLoading archívum betöltése vagy tárolása, illetve CArchive::IsStoring annak meghatározása, hogy az archívum betöltődik-e vagy tárolva van-e.

Serializemeghívja és CArchive::WriteObjectmeghívjaCArchive::ReadObject. Ezek a függvények a beszúrási operátorhoz ( <<) és az CArchive extrakciós operátorhoz () >>vannak társítva.

Szerializálási példákért tekintse meg az objektum szerializálása című cikket.

Example

Tekintse meg CObList::CObList az CAge összes CObject példában használt osztály listáját.

void CAge::Serialize(CArchive& ar)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())
      ar << m_years;
   else
      ar >> m_years;
}

Lásd még

hierarchiadiagram