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 CObject
klasy 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 NULL
są , 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 CObject
klasy 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ącejCRuntimeClass
strukturę klasy bazowej.CRuntimeClass* m_pBaseClass
Jeśli aplikacja jest statycznie połączona z MFC, wskaźnik doCRuntimeClass
struktury klasy bazowej.
Ta funkcja wymaga użycia IMPLEMENT_DYNAMIC
makra , IMPLEMENT_DYNCREATE
lub 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 CObject
klasą 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_DYNAMIC
makr , DECLARE_DYNCREATE
lub 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;
}