Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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_lpszClassNameCiąg o wartości null zawierający nazwę klasy ASCII.int m_nObjectSizeRozmiar 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_wSchemaNumer schematu ( -1 dla klas nieserializowalnych). Zobacz makro,IMPLEMENT_SERIALaby 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ącejCRuntimeClassstrukturę klasy bazowej.CRuntimeClass* m_pBaseClassJeśli aplikacja jest statycznie połączona z MFC, wskaźnik doCRuntimeClassstruktury 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;
}