Udostępnij za pośrednictwem


CObject Klasa

Główna klasa bazowa biblioteki klas programu Microsoft Foundation.

Składnia

class AFX_NOVTABLE CObject

Elementy członkowskie

Konstruktory chronione

Nazwa/nazwisko opis
CObject::CObject Konstruktor domyślny.

Metody publiczne

Nazwa/nazwisko opis
CObject::AssertValid Weryfikuje integralność tego obiektu.
CObject::Dump Tworzy zrzut diagnostyczny tego obiektu.
CObject::GetRuntimeClass CRuntimeClass Zwraca strukturę odpowiadającą klasie tego obiektu.
CObject::IsKindOf Testuje relację tego obiektu z daną klasą.
CObject::IsSerializable Sprawdza, czy ten obiekt można serializować.
CObject::Serialize Ładuje lub przechowuje obiekt z/do archiwum.

Operatory publiczne

Nazwa/nazwisko opis
CObject::operator delete Operator specjalny delete .
CObject::operator new Operator specjalny new .

Uwagi

Służy on nie tylko jako katalog główny dla klas bibliotek, takich jak CFile i CObList, ale także dla klas, które piszesz. CObject zapewnia podstawowe usługi, w tym

  • Obsługa serializacji
  • Informacje o klasie czasu wykonywania
  • Dane wyjściowe diagnostyki obiektu
  • Zgodność z klasami kolekcji

CObject nie obsługuje wielu dziedziczenia. Klasy pochodne mogą mieć tylko jedną CObject klasę bazową i CObject muszą być najdalej w hierarchii. Dopuszczalne jest jednak posiadanie struktur i klas innych niż CObject-pochodne w gałęziach dziedziczenia wielokrotnego po prawej stronie.

W przypadku używania niektórych opcjonalnych makr w implementacji i deklaracjach klas będziesz korzystać z głównych korzyści wynikających z CObject wyprowadzenia.

Makra DECLARE_DYNAMIC pierwszego poziomu i IMPLEMENT_DYNAMIC, umożliwiają dostęp w czasie wykonywania do nazwy klasy i jej pozycji w hierarchii. Z kolei pozwala to na znaczące dumpingi diagnostyczne.

Makra DECLARE_SERIAL drugiego poziomu i IMPLEMENT_SERIAL, obejmują wszystkie funkcje makr pierwszego poziomu i umożliwiają one "serializację" do i z "archiwum".

Aby uzyskać informacje na temat wyprowadzania klas programu Microsoft Foundation i klas języka C++ w ogóle i używania programu , zobacz Using CObject and Serialization (Używanie CObjectklasy CObject i serializacji).

Hierarchia dziedziczenia

CObject

Wymagania

Nagłówek: afx.h

CObject::AssertValid

Weryfikuje integralność tego obiektu.

virtual void AssertValid() const;

Uwagi

AssertValid Przeprowadza sprawdzanie poprawności tego obiektu, sprawdzając jego stan wewnętrzny. W wersji debugowania biblioteki może być asercji, AssertValid a następnie zakończyć program z komunikatem zawierającym numer wiersza i nazwę pliku, w którym asercji nie powiodło się.

Podczas pisania własnej klasy należy zastąpić AssertValid funkcję w celu zapewnienia usług diagnostycznych dla siebie i innych użytkowników klasy. Przesłonięcia AssertValid zwykle wywołuje AssertValid funkcję klasy bazowej przed sprawdzeniem składowych danych unikatowych dla klasy pochodnej.

Ponieważ AssertValid jest funkcją const , nie można zmienić stanu obiektu podczas testu. Własne funkcje klasy AssertValid pochodnej nie powinny zgłaszać wyjątków, ale raczej powinny potwierdzić, czy wykrywają nieprawidłowe dane obiektu.

Definicja "ważności" zależy od klasy obiektu. Zgodnie z regułą funkcja powinna wykonać "płytkie sprawdzanie". Oznacza to, że jeśli obiekt zawiera wskaźniki do innych obiektów, powinien sprawdzić, czy wskaźniki nie NULLsą , ale nie powinny wykonywać testów poprawności na obiektach, do których odwołuje się wskaźnik.

Przykład

Zobacz CObList::CObList listę klasy używanej CAge we wszystkich CObject przykładach.

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

Aby zapoznać się z innym przykładem, zobacz AfxDoForAllObjects.

CObject::CObject

Te funkcje są standardowymi CObject konstruktorami.

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

Parametry

objectSrc
Odwołanie do innego CObject

Uwagi

Domyślna wersja jest automatycznie wywoływana przez konstruktor klasy pochodnej.

Jeśli klasa jest serializowalna (zawiera IMPLEMENT_SERIAL makro), musisz mieć domyślny konstruktor (konstruktor bez argumentów) w deklaracji klasy. Jeśli nie potrzebujesz konstruktora domyślnego, zadeklaruj prywatny lub chroniony konstruktor "pusty". Aby uzyskać więcej informacji, zobacz Using CObject.

Standardowy konstruktor kopiowania klas C++ wykonuje kopię składową po składowej. Obecność prywatnego CObject konstruktora kopiowania gwarantuje komunikat o błędzie kompilatora, jeśli konstruktor kopii klasy jest potrzebny, ale niedostępny. Podaj konstruktor kopiowania, jeśli klasa wymaga tej możliwości.

Przykład

Zobacz CObList::CObList listę klas używanych CAge w przykładach CObject .

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

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

CObject::Dump

Zrzuty zawartości obiektu do CDumpContext obiektu.

virtual void Dump(CDumpContext& dc) const;

Parametry

dc
Kontekst zrzutu diagnostycznego dla dumpingu, zwykle afxDump.

Uwagi

Podczas pisania własnej klasy należy zastąpić Dump funkcję w celu zapewnienia usług diagnostycznych dla siebie i innych użytkowników klasy. Przesłonięcia Dump zwykle wywołuje Dump funkcję klasy bazowej przed drukowaniem składowych danych unikatowych dla klasy pochodnej. CObject::Dump wyświetla nazwę klasy, jeśli klasa używa makra IMPLEMENT_DYNAMIC lub IMPLEMENT_SERIAL .

Uwaga

Funkcja Dump nie powinna drukować znaku nowego wiersza na końcu danych wyjściowych.

Dump wywołania mają sens tylko w wersji debugowania biblioteki klas programu Microsoft Foundation. Należy stosować wywołania nawiasów kwadratowych, deklaracje funkcji i implementacje funkcji z instrukcjami #ifdef _DEBUG, #endif na potrzeby kompilacji warunkowej.

Ponieważ Dump jest funkcją const , nie można zmienić stanu obiektu podczas zrzutu.

Operator CDumpContext wstawiania (<<) wywołuje polecenie Dump po CObject wstawieniu wskaźnika.

Dump zezwala tylko na "acykliczne" dumping obiektów. Możesz na przykład zrzucić listę obiektów, ale jeśli jeden z obiektów jest samą listą, ostatecznie przepełnisz stos.

Przykład

Zobacz CObList::CObList listę klasy używanej CAge we wszystkich CObject przykładach.

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

CObject::GetRuntimeClass

CRuntimeClass Zwraca strukturę odpowiadającą klasie tego obiektu.

virtual CRuntimeClass* GetRuntimeClass() const;

Wartość zwracana

Wskaźnik do struktury odpowiadającej CRuntimeClass klasie tego obiektu; nigdy .NULL

Uwagi

Dla każdej CObjectklasy pochodnej istnieje jedna CRuntimeClass struktura. Elementy członkowskie struktury są następujące:

  • LPCSTR m_lpszClassName Ciąg o wartości null zawierający nazwę klasy ASCII.

  • int m_nObjectSize Rozmiar obiektu w bajtach. Jeśli obiekt zawiera elementy członkowskie danych wskazujące przydzieloną pamięć, rozmiar tej pamięci nie jest uwzględniony.

  • UINT m_wSchema Numer schematu ( -1 dla klas nieserializowalnych). Zobacz makro, IMPLEMENT_SERIAL aby uzyskać opis numeru schematu.

  • CObject* (PASCAL* m_pfnCreateObject)() Wskaźnik funkcji do konstruktora domyślnego, który tworzy obiekt klasy (prawidłowy tylko wtedy, gdy klasa obsługuje tworzenie dynamiczne; w przeciwnym razie zwraca wartość NULL).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() Jeśli aplikacja jest dynamicznie połączona z wersją MFC AFXDLL, wskaźnik do funkcji zwracającej CRuntimeClass strukturę klasy bazowej.

  • CRuntimeClass* m_pBaseClass Jeśli aplikacja jest statycznie połączona z MFC, wskaźnik do CRuntimeClass struktury klasy bazowej.

Ta funkcja wymaga użycia IMPLEMENT_DYNAMICmakra , IMPLEMENT_DYNCREATElub IMPLEMENT_SERIAL w implementacji klasy. W przeciwnym razie otrzymasz nieprawidłowe wyniki.

Przykład

Zobacz CObList::CObList listę klasy używanej CAge we wszystkich CObject przykładach.

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

CObject::IsKindOf

Testuje relację tego obiektu z daną klasą.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

Parametry

pClass
Wskaźnik do struktury skojarzonej z CObjectklasą pochodnąCRuntimeClass.

Wartość zwracana

Nonzero, jeśli obiekt odpowiada klasie; w przeciwnym razie 0.

Uwagi

Ta funkcja sprawdza pClass , czy (1) jest obiektem określonej klasy lub (2) jest obiektem klasy pochodzącej z określonej klasy. Ta funkcja działa tylko dla klas zadeklarowanych za pomocą DECLARE_DYNAMICmakr , DECLARE_DYNCREATElub DECLARE_SERIAL .

Nie używaj tej funkcji w szerokim zakresie, ponieważ pokonuje funkcję polimorfizmu języka C++. Zamiast tego użyj funkcji wirtualnych.

Przykład

Zobacz CObList::CObList listę klasy używanej CAge we wszystkich CObject przykładach.

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

Sprawdza, czy ten obiekt kwalifikuje się do serializacji.

BOOL IsSerializable() const;

Wartość zwracana

Niezerowe, jeśli ten obiekt może być serializowany; w przeciwnym razie 0.

Uwagi

Aby klasa można było serializować, jego deklaracja musi zawierać DECLARE_SERIAL makro, a implementacja IMPLEMENT_SERIAL musi zawierać makro.

Uwaga

Nie przesłaniaj tej funkcji.

Przykład

Zobacz CObList::CObList listę klasy używanej CAge we wszystkich CObject przykładach.

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

CObject::operator delete

W przypadku wersji biblioteki operator delete zwalnia pamięć przydzieloną przez operator 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);

Uwagi

W wersji debugowania operator delete uczestniczy w schemacie monitorowania alokacji zaprojektowanym do wykrywania przecieków pamięci.

Jeśli używasz wiersza kodu

#define new DEBUG_NEW

przed dowolną implementacją w obiekcie . Plik CPP, a następnie zostanie użyta trzecia wersja, przechowując nazwę pliku i numer wiersza w przydzielonym bloku na potrzeby późniejszego delete raportowania. Nie musisz martwić się o podanie dodatkowych parametrów; makro zajmuje się tym za Ciebie.

Nawet jeśli nie używasz DEBUG_NEW w trybie debugowania, nadal uzyskujesz wykrywanie przecieków, ale bez opisanego powyżej raportowania numerów wiersza pliku źródłowego.

Jeśli zastąpisz operatory new i delete, przejmiesz tę funkcję diagnostyczną.

Przykład

Zobacz CObList::CObList listę klas używanych CAge w przykładach 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

W przypadku wersji wydania biblioteki operator new wykonuje optymalną alokację pamięci w sposób podobny do 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);

Uwagi

W wersji debugowania operator new uczestniczy w schemacie monitorowania alokacji zaprojektowanym do wykrywania przecieków pamięci.

Jeśli używasz wiersza kodu

#define new DEBUG_NEW

przed dowolną implementacją w obiekcie . Plik CPP, a następnie zostanie użyta druga wersja new , przechowując nazwę pliku i numer wiersza w przydzielonym bloku na potrzeby późniejszego raportowania. Nie musisz martwić się o podanie dodatkowych parametrów; makro zajmuje się tym za Ciebie.

Nawet jeśli nie używasz DEBUG_NEW w trybie debugowania, nadal uzyskujesz wykrywanie przecieków, ale bez opisanego powyżej raportowania numerów wiersza pliku źródłowego.

Uwaga

Jeśli zastąpisz ten operator, musisz również zastąpić delete. Nie używaj standardowej funkcji biblioteki _new_handler .

Przykład

Zobacz CObList::CObList listę klas używanych CAge w przykładach 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

Odczytuje lub zapisuje ten obiekt z lub do archiwum.

virtual void Serialize(CArchive& ar);

Parametry

ar
CArchive Obiekt do serializacji do lub z.

Uwagi

Zastąpij Serialize dla każdej klasy, którą zamierzasz serializować. Przesłonięć Serialize Serialize musi najpierw wywołać funkcję klasy bazowej.

Należy również użyć makra DECLARE_SERIAL w deklaracji klasy i należy użyć makra IMPLEMENT_SERIAL w implementacji.

Użyj CArchive::IsLoading polecenia lub CArchive::IsStoring , aby określić, czy archiwum jest ładowane, czy przechowywane.

Serialize jest wywoływana przez CArchive::ReadObject i CArchive::WriteObject. Te funkcje są skojarzone z operatorem CArchive wstawiania ( <<) i operatorem wyodrębniania ( >>).

Aby zapoznać się z przykładami serializacji, zobacz artykuł Serializowanie obiektu.

Przykład

Zobacz CObList::CObList listę klasy używanej CAge we wszystkich CObject przykładach.

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

Zobacz też

Wykres hierarchii