Bagikan melalui


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 CObjectdi 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 CObjectkelas 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, mengembalikan NULL).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() Jika aplikasi Anda secara dinamis ditautkan ke MFC versi AFXDLL, penunjuk ke fungsi yang mengembalikan CRuntimeClass struktur kelas dasar.

  • CRuntimeClass* m_pBaseClass Jika aplikasi Anda secara statis ditautkan ke MFC, penunjuk ke CRuntimeClass struktur kelas dasar.

Fungsi ini memerlukan penggunaan IMPLEMENT_DYNAMICmakro , , IMPLEMENT_DYNCREATEatau 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_DYNAMICmakro , , DECLARE_DYNCREATEatau 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 mallocdengan .

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 deletealih . 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;
}

Baca juga

Bagan Hierarki