CObject
Kelas
Kelas dasar utama untuk Pustaka Kelas Microsoft Foundation.
Sintaks
class AFX_NOVTABLE CObject
Anggota
Konstruktor yang Dilindungi
Nama | Deskripsi |
---|---|
CObject::CObject |
Konstruktor default. |
Metode Publik
Nama | Deskripsi |
---|---|
CObject::AssertValid |
Memvalidasi integritas objek ini. |
CObject::Dump |
Menghasilkan cadangan diagnostik objek ini. |
CObject::GetRuntimeClass |
Mengembalikan struktur yang CRuntimeClass sesuai dengan kelas objek ini. |
CObject::IsKindOf |
Menguji hubungan objek ini ke kelas tertentu. |
CObject::IsSerializable |
Pengujian untuk melihat apakah objek ini dapat diserialisasikan. |
CObject::Serialize |
Memuat atau menyimpan objek dari/ke arsip. |
Operator Publik
Nama | Deskripsi |
---|---|
CObject::operator delete |
Operator khusus delete . |
CObject::operator new |
Operator khusus new . |
Keterangan
Ini berfungsi sebagai akar tidak hanya untuk kelas pustaka seperti CFile
dan CObList
, tetapi juga untuk kelas yang Anda tulis. CObject
menyediakan layanan dasar, termasuk
- Dukungan serialisasi
- Informasi kelas run-time
- Output diagnostik objek
- Kompatibilitas dengan kelas koleksi
CObject
tidak mendukung beberapa pewarisan. Kelas turunan Anda hanya dapat memiliki satu CObject
kelas dasar, dan itu CObject
harus paling kiri dalam hierarki. Namun, hal ini diizinkan untuk memiliki struktur dan kelas non-turunan CObject
di cabang beberapa warisan tangan kanan.
Anda akan menyadari manfaat utama dari CObject
derivasi jika Anda menggunakan beberapa makro opsional dalam implementasi dan deklarasi kelas Anda.
Makro tingkat pertama, DECLARE_DYNAMIC
dan IMPLEMENT_DYNAMIC
, mengizinkan akses run-time ke nama kelas dan posisinya dalam hierarki. Ini, pada gilirannya, memungkinkan pembuangan diagnostik yang bermakna.
Makro tingkat kedua, DECLARE_SERIAL
dan IMPLEMENT_SERIAL
, menyertakan semua fungsionalitas makro tingkat pertama, dan memungkinkan objek untuk "diserialisasikan" ke dan dari "arsip."
Untuk informasi tentang mendapatkan kelas Microsoft Foundation dan kelas C++ secara umum dan menggunakan CObject
, lihat Menggunakan CObject dan Serialisasi.
Hierarki Warisan
CObject
Persyaratan
Header: afx.h
CObject::AssertValid
Memvalidasi integritas objek ini.
virtual void AssertValid() const;
Keterangan
AssertValid
melakukan pemeriksaan validitas pada objek ini dengan memeriksa status internalnya. Dalam versi Debug pustaka, AssertValid
dapat menegaskan lalu mengakhiri program dengan pesan yang mencantumkan nomor baris dan nama file tempat pernyataan gagal.
Saat menulis kelas Anda sendiri, Anda harus mengambil alih AssertValid
fungsi untuk menyediakan layanan diagnostik untuk diri Anda sendiri dan pengguna lain dari kelas Anda. Penimpaan AssertValid
biasanya memanggil AssertValid
fungsi kelas dasarnya sebelum memeriksa anggota data yang unik ke kelas turunan.
Karena AssertValid
merupakan const
fungsi, Anda tidak diizinkan untuk mengubah status objek selama pengujian. Fungsi kelas AssertValid
turunan Anda sendiri tidak boleh melemparkan pengecualian melainkan harus menegaskan apakah fungsi tersebut mendeteksi data objek yang tidak valid.
Definisi "validitas" tergantung pada kelas objek. Sebagai aturan, fungsi harus melakukan "pemeriksaan dangkal." Artinya, jika objek berisi penunjuk ke objek lain, objek harus memeriksa untuk melihat apakah pointer tidak NULL
, tetapi seharusnya tidak melakukan pengujian validitas pada objek yang dimaksud oleh pointer.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam semua CObject
contoh.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Untuk contoh lain, lihat AfxDoForAllObjects
.
CObject::CObject
Fungsi-fungsi ini adalah konstruktor standar CObject
.
CObject();
CObject(const CObject& objectSrc);
Parameter
objectSrc
Referensi ke referensi lain CObject
Keterangan
Versi default secara otomatis dipanggil oleh konstruktor kelas turunan Anda.
Jika kelas Anda dapat diserialisasikan IMPLEMENT_SERIAL
(menggabungkan makro), maka Anda harus memiliki konstruktor default (konstruktor tanpa argumen) dalam deklarasi kelas Anda. Jika Anda tidak memerlukan konstruktor default, deklarasikan konstruktor "kosong" privat atau dilindungi. Untuk informasi selengkapnya, lihat Menggunakan CObject
.
Konstruktor salinan kelas default C++ standar melakukan salinan anggota demi anggota. Kehadiran konstruktor salinan privat CObject
menjamin pesan kesalahan kompilator jika konstruktor salinan kelas Anda diperlukan tetapi tidak tersedia. Berikan konstruktor salinan jika kelas Anda memerlukan kemampuan ini.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam CObject
contoh.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Mencadangkan konten objek Anda ke CDumpContext
objek.
virtual void Dump(CDumpContext& dc) const;
Parameter
dc
Konteks cadangan diagnostik untuk pembuangan, biasanya afxDump
.
Keterangan
Saat menulis kelas Anda sendiri, Anda harus mengambil alih Dump
fungsi untuk menyediakan layanan diagnostik untuk diri Anda sendiri dan pengguna lain dari kelas Anda. Penimpaan Dump
biasanya memanggil Dump
fungsi kelas dasarnya sebelum mencetak anggota data yang unik ke kelas turunan. CObject::Dump
mencetak nama kelas jika kelas Anda menggunakan IMPLEMENT_DYNAMIC
makro atau IMPLEMENT_SERIAL
.
Catatan
Fungsi Anda Dump
tidak boleh mencetak karakter baris baru di akhir outputnya.
Dump
panggilan masuk akal hanya dalam versi Debug Pustaka Kelas Microsoft Foundation. Anda harus mem-bracket panggilan, deklarasi fungsi, dan implementasi fungsi dengan #ifdef _DEBUG
, #endif
pernyataan untuk kompilasi bersyarat.
Karena Dump
merupakan const
fungsi, Anda tidak diizinkan untuk mengubah status objek selama pencadangan.
Operator CDumpContext
penyisipan (<<) memanggil Dump
saat CObject
penunjuk disisipkan.
Dump
hanya mengizinkan pembuangan objek "acyclic". Anda dapat mencadangkan daftar objek, misalnya, tetapi jika salah satu objek adalah daftar itu sendiri, Anda akhirnya akan meluapkan tumpukan.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam semua CObject
contoh.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
Mengembalikan struktur yang CRuntimeClass
sesuai dengan kelas objek ini.
virtual CRuntimeClass* GetRuntimeClass() const;
Tampilkan Nilai
Penunjuk ke struktur yang CRuntimeClass
sesuai dengan kelas objek ini; jangan pernah NULL
.
Keterangan
Ada satu CRuntimeClass
struktur untuk setiap CObject
kelas turunan. Anggota struktur adalah sebagai berikut:
LPCSTR m_lpszClassName
String null-terminated yang berisi nama kelas ASCII.int m_nObjectSize
Ukuran objek, dalam byte. Jika objek memiliki anggota data yang menunjuk ke memori yang dialokasikan, ukuran memori tersebut tidak disertakan.UINT m_wSchema
Nomor skema ( -1 untuk kelas yang tidak dapat diserialisasi).IMPLEMENT_SERIAL
Lihat makro untuk deskripsi nomor skema.CObject* (PASCAL* m_pfnCreateObject)()
Penunjuk fungsi ke konstruktor default yang membuat objek kelas Anda (hanya valid jika kelas mendukung pembuatan dinamis; jika tidak, mengembalikanNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Jika aplikasi Anda secara dinamis ditautkan ke MFC versi AFXDLL, penunjuk ke fungsi yang mengembalikanCRuntimeClass
struktur kelas dasar.CRuntimeClass* m_pBaseClass
Jika aplikasi Anda secara statis ditautkan ke MFC, penunjuk keCRuntimeClass
struktur kelas dasar.
Fungsi ini memerlukan penggunaan IMPLEMENT_DYNAMIC
makro , , IMPLEMENT_DYNCREATE
atau IMPLEMENT_SERIAL
dalam implementasi kelas. Anda akan mendapatkan hasil yang salah jika tidak.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam semua CObject
contoh.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Menguji hubungan objek ini ke kelas tertentu.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Parameter
pClass
Penunjuk ke struktur yang CRuntimeClass
terkait dengan kelas turunan Anda CObject
.
Tampilkan Nilai
Bukan nol jika objek sesuai dengan kelas; jika tidak, 0.
Keterangan
Fungsi ini menguji pClass
untuk melihat apakah (1) itu adalah objek dari kelas yang ditentukan atau (2) itu adalah objek kelas yang berasal dari kelas yang ditentukan. Fungsi ini hanya berfungsi untuk kelas yang dideklarasikan dengan DECLARE_DYNAMIC
makro , , DECLARE_DYNCREATE
atau DECLARE_SERIAL
.
Jangan gunakan fungsi ini secara ekstensif karena mengalahkan fitur polimorfisme C++. Gunakan fungsi virtual sebagai gantinya.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam semua CObject
contoh.
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
Menguji apakah objek ini memenuhi syarat untuk serialisasi.
BOOL IsSerializable() const;
Tampilkan Nilai
Bukan nol jika objek ini dapat diserialisasikan; jika tidak, 0.
Keterangan
Agar kelas dapat diserialisasikan, deklarasinya harus berisi DECLARE_SERIAL
makro, dan implementasinya harus berisi IMPLEMENT_SERIAL
makro.
Catatan
Jangan ambil alih fungsi ini.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam semua CObject
contoh.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Untuk versi Rilis pustaka, operator delete
membebaskan memori yang dialokasikan oleh 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);
Keterangan
Dalam versi Debug, operator delete
berpartisipasi dalam skema pemantauan alokasi yang dirancang untuk mendeteksi kebocoran memori.
Jika Anda menggunakan baris kode
#define new DEBUG_NEW
sebelum salah satu implementasi Anda dalam . File CPP, kemudian versi delete
ketiga akan digunakan, menyimpan nama file dan nomor baris di blok yang dialokasikan untuk pelaporan nanti. Anda tidak perlu khawatir tentang menyediakan parameter tambahan; makro mengurus itu untuk Anda.
Bahkan jika Anda tidak menggunakan DEBUG_NEW
dalam mode Debug, Anda masih mendapatkan deteksi kebocoran, tetapi tanpa pelaporan nomor baris file sumber yang dijelaskan di atas.
Jika Anda mengambil alih operator new
dan delete
, Anda kehilangan kemampuan diagnostik ini.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam CObject
contoh.
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
Untuk versi Rilis pustaka, operator new
melakukan alokasi memori optimal dengan cara yang mirip malloc
dengan .
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);
Keterangan
Dalam versi Debug, operator new
berpartisipasi dalam skema pemantauan alokasi yang dirancang untuk mendeteksi kebocoran memori.
Jika Anda menggunakan baris kode
#define new DEBUG_NEW
sebelum salah satu implementasi Anda dalam . File CPP, kemudian versi new
kedua akan digunakan, menyimpan nama file dan nomor baris di blok yang dialokasikan untuk pelaporan nanti. Anda tidak perlu khawatir tentang menyediakan parameter tambahan; makro mengurus itu untuk Anda.
Bahkan jika Anda tidak menggunakan DEBUG_NEW
dalam mode Debug, Anda masih mendapatkan deteksi kebocoran, tetapi tanpa pelaporan nomor baris file sumber yang dijelaskan di atas.
Catatan
Jika Anda mengambil alih operator ini, Anda juga harus mengambil delete
alih . Jangan gunakan fungsi pustaka _new_handler
standar.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam CObject
contoh.
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
Membaca atau menulis objek ini dari atau ke arsip.
virtual void Serialize(CArchive& ar);
Parameter
ar
Objek CArchive
untuk diserialisasikan ke atau dari.
Keterangan
Ambil alih Serialize
untuk setiap kelas yang ingin Anda serialkan. Penggantian Serialize
harus terlebih dahulu memanggil Serialize
fungsi kelas dasarnya.
Anda juga harus menggunakan DECLARE_SERIAL
makro dalam deklarasi kelas Anda, dan Anda harus menggunakan IMPLEMENT_SERIAL
makro dalam implementasi.
Gunakan CArchive::IsLoading
atau CArchive::IsStoring
untuk menentukan apakah arsip sedang dimuat atau disimpan.
Serialize
dipanggil oleh CArchive::ReadObject
dan CArchive::WriteObject
. Fungsi-fungsi ini dikaitkan dengan CArchive
operator penyisipan ( <<
) dan operator ekstraksi ( >>
).
Untuk contoh serialisasi, lihat artikel Membuat Serialisasi Objek.
Contoh
Lihat CObList::CObList
untuk daftar kelas yang CAge
digunakan dalam semua CObject
contoh.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}