CObject
Sınıf
Microsoft Foundation Sınıf Kitaplığı için temel sınıf.
Sözdizimi
class AFX_NOVTABLE CObject
Üyeler
Korumalı Oluşturucular
Veri Akışı Adı | Açıklama |
---|---|
CObject::CObject |
Varsayılan oluşturucu. |
Genel Yöntemler
Veri Akışı Adı | Açıklama |
---|---|
CObject::AssertValid |
Bu nesnenin bütünlüğünü doğrular. |
CObject::Dump |
Bu nesnenin tanılama dökümünü oluşturur. |
CObject::GetRuntimeClass |
Bu nesnenin CRuntimeClass sınıfına karşılık gelen yapıyı döndürür. |
CObject::IsKindOf |
Bu nesnenin belirli bir sınıfla ilişkisini sınar. |
CObject::IsSerializable |
Bu nesnenin seri hale getirilip getirilemeyeceğini görmek için sınar. |
CObject::Serialize |
Bir nesneyi arşivden/arşive yükler veya depolar. |
Ortak İşleçler
Veri Akışı Adı | Açıklama |
---|---|
CObject::operator delete |
Özel delete işleç. |
CObject::operator new |
Özel new işleç. |
Açıklamalar
Yalnızca ve CObList
gibi CFile
kitaplık sınıfları için değil, aynı zamanda yazdığınız sınıflar için de kök görevi görür. CObject
aşağıdakiler dahil olmak üzere temel hizmetleri sağlar:
- Serileştirme desteği
- Çalışma zamanı sınıf bilgileri
- Nesne tanılama çıktısı
- Koleksiyon sınıfları ile uyumluluk
CObject
birden çok devralmayı desteklemez. Türetilmiş sınıflarınızın yalnızca bir CObject
temel sınıfı olabilir ve bu CObject
sınıf hiyerarşide en sol tarafta olmalıdır. Ancak sağ taraftaki çoklu devralma dallarında yapıların ve CObject
türetilmemiş sınıfların olması izin verilebilir.
Sınıf uygulamanızda ve bildirimlerinizde isteğe bağlı makrolardan bazılarını kullanırsanız türetmenin önemli avantajlarını CObject
elde edersiniz.
birinci düzey makrolar DECLARE_DYNAMIC
ve IMPLEMENT_DYNAMIC
, sınıf adına ve hiyerarşideki konumuna çalışma zamanı erişimine izin verir. Bu da anlamlı tanılama dökümü sağlar.
İkinci düzey makrolar DECLARE_SERIAL
ve IMPLEMENT_SERIAL
, birinci düzey makroların tüm işlevlerini içerir ve bir nesnenin "arşive" ve arşivden "serileştirilmesini" sağlar.
Genel olarak Microsoft Foundation sınıflarını ve C++ sınıflarını türetme ve kullanma CObject
hakkında bilgi için bkz . CObject ve Seri hale getirme kullanma.
Devralma Hiyerarşisi
CObject
Gereksinimler
Üstbilgi: afx.h
CObject::AssertValid
Bu nesnenin bütünlüğünü doğrular.
virtual void AssertValid() const;
Açıklamalar
AssertValid
bu nesnenin iç durumunu denetleyerek bir geçerlilik denetimi gerçekleştirir. Kitaplığın Hata ayıklama sürümünde, AssertValid
onaylama işleminin başarısız olduğu satır numarasını ve dosya adını listeleyen bir iletiyle programı onaylayıp sonlandırabilir.
Kendi sınıfınızı yazarken, kendiniz ve sınıfınızın diğer kullanıcıları için tanılama hizmetleri sağlamak üzere işlevini geçersiz kılmalısınız AssertValid
. geçersiz kılınan AssertValid
genellikle türetilmiş sınıfa özgü veri üyelerini denetlemeden önce temel sınıfının işlevini çağırır AssertValid
.
AssertValid
Bir const
işlev olduğundan, test sırasında nesne durumunu değiştirmenize izin verilmez. Kendi türetilmiş sınıf AssertValid
işlevleriniz özel durumlar oluşturmamalı, bunun yerine geçersiz nesne verilerini algılayıp algılamadıklarını onaylamalıdır.
"Geçerlilik" tanımı nesnenin sınıfına bağlıdır. Kural olarak, işlevin "sığ denetim" yapması gerekir. Başka bir deyişle, bir nesne diğer nesnelere yönelik işaretçiler içeriyorsa, işaretçilerin olup olmadığını NULL
denetlemeli, ancak işaretçiler tarafından başvuruda bulunılan nesneler üzerinde geçerlilik testi yapmamalıdır.
Örnek
Tüm CObject
örneklerde kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Başka bir örnek için bkz AfxDoForAllObjects
. .
CObject::CObject
Bu işlevler standart CObject
oluşturuculardır.
CObject();
CObject(const CObject& objectSrc);
Parametreler
objectSrc
Başka bir başvuru CObject
Açıklamalar
Varsayılan sürüm, türetilmiş sınıfınızın oluşturucu tarafından otomatik olarak çağrılır.
Sınıfınız serileştirilebilirse (makroyu IMPLEMENT_SERIAL
içerir), sınıf bildiriminizde varsayılan bir oluşturucuya (bağımsız değişken içermeyen bir oluşturucu) sahip olmanız gerekir. Varsayılan bir oluşturucuya ihtiyacınız yoksa, özel veya korumalı bir "boş" oluşturucu bildirin. Daha fazla bilgi için bkz . Kullanma CObject
.
Standart C++ varsayılan sınıf kopyası oluşturucu, üyeye üye kopya yapar. Özel CObject
kopya oluşturucusunun varlığı, sınıfınızın kopya oluşturucusunun gerekli olması ancak kullanılabilir olmaması durumunda derleyici hata iletisini garanti eder. Sınıfınız bu özelliği gerektiriyorsa bir kopya oluşturucu sağlayın.
Örnek
Örneklerde CObject
kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Nesnenizin içeriğini bir CDumpContext
nesneye döküm eder.
virtual void Dump(CDumpContext& dc) const;
Parametreler
dc
Genellikle döküm için afxDump
tanılama dökümü bağlamı.
Açıklamalar
Kendi sınıfınızı yazarken, kendiniz ve sınıfınızın diğer kullanıcıları için tanılama hizmetleri sağlamak üzere işlevini geçersiz kılmalısınız Dump
. geçersiz kılınan Dump
genellikle türetilmiş sınıfa özgü veri üyelerini yazdırmadan önce temel sınıfının işlevini çağırır Dump
. CObject::Dump
sınıfınız veya IMPLEMENT_SERIAL
makroyu IMPLEMENT_DYNAMIC
kullanıyorsa sınıf adını yazdırır.
Not
İşleviniz Dump
çıktısının sonunda yeni satır karakteri yazdırmamalıdır.
Dump
çağrıları yalnızca Microsoft Foundation Sınıf Kitaplığı'nın Hata Ayıklama sürümünde anlamlıdır. Koşullu derleme için deyimleri ile çağrıları, işlev bildirimlerini ve işlev uygulamalarını köşeli ayraçlamalısınız#ifdef _DEBUG
#endif
.
Dump
bir const
işlev olduğundan, döküm sırasında nesne durumunu değiştirmenize izin verilmez.
Ekleme () işleci, işaretçi CObject
eklendiğinde çağırırDump
.<<CDumpContext
Dump
nesnelerin yalnızca "ansiklik" dökümünü sağlar. Örneğin, bir nesne listesinin dökümünü alabilirsiniz, ancak nesnelerden biri listenin kendisiyse, sonunda yığının taşmasına neden olursunuz.
Örnek
Tüm CObject
örneklerde kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
Bu nesnenin CRuntimeClass
sınıfına karşılık gelen yapıyı döndürür.
virtual CRuntimeClass* GetRuntimeClass() const;
Dönüş Değeri
Bu nesnenin sınıfına CRuntimeClass
karşılık gelen yapıya ilişkin bir işaretçi; hiçbir zaman NULL
.
Açıklamalar
Türetilmiş her CObject
sınıf için bir CRuntimeClass
yapı vardır. Yapı üyeleri aşağıdaki gibidir:
LPCSTR m_lpszClassName
ASCII sınıf adını içeren null olarak sonlandırılan bir dize.int m_nObjectSize
Nesnenin bayt cinsinden boyutu. Nesne, ayrılan belleği işaret eden veri üyelerine sahipse, bu belleğin boyutu dahil değildir.UINT m_wSchema
Şema numarası ( seri durumdan çıkarılamayan sınıflar için -1). Şema numarasınınIMPLEMENT_SERIAL
açıklaması için makroya bakın.CObject* (PASCAL* m_pfnCreateObject)()
Sınıfınızın nesnesini oluşturan varsayılan oluşturucuya yönelik bir işlev işaretçisi (yalnızca sınıfı dinamik oluşturmayı destekliyorsa geçerlidir; aksi takdirde döndürürNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Uygulamanız MFC'nin AFXDLL sürümüne dinamik olarak bağlıysa, temel sınıfın yapısını döndürenCRuntimeClass
bir işlev işaretçisi.CRuntimeClass* m_pBaseClass
Uygulamanız MFC'ye statik olarak bağlıysa, temel sınıfınCRuntimeClass
yapısına bir işaretçi.
Bu işlev, sınıf uygulamasında , IMPLEMENT_DYNCREATE
veya IMPLEMENT_SERIAL
makrosunun kullanılmasını IMPLEMENT_DYNAMIC
gerektirir. Aksi takdirde yanlış sonuçlar alırsınız.
Örnek
Tüm CObject
örneklerde kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Bu nesnenin belirli bir sınıfla ilişkisini sınar.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Parametreler
pClass
Türetilmiş sınıfınızla CObject
ilişkilendirilmiş bir CRuntimeClass
yapıya işaretçi.
Dönüş Değeri
Nesne sınıfa karşılık geliyorsa sıfır olmayan; aksi takdirde 0.
Açıklamalar
Bu işlev pClass
, (1) öğesinin belirtilen sınıfın bir nesnesi olup olmadığını veya (2) belirtilen sınıftan türetilmiş bir sınıfın nesnesi olup olmadığını test eder. Bu işlev yalnızca , DECLARE_DYNCREATE
veya DECLARE_SERIAL
makro ile DECLARE_DYNAMIC
bildirilen sınıflar için çalışır.
C++ polimorfizmi özelliğini yendiğinden bu işlevi kapsamlı olarak kullanmayın. Bunun yerine sanal işlevleri kullanın.
Örnek
Tüm CObject
örneklerde kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
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
Bu nesnenin serileştirme için uygun olup olmadığını sınar.
BOOL IsSerializable() const;
Dönüş Değeri
Bu nesne seri hale getirilebiliyorsa sıfır olmayan; aksi takdirde 0.
Açıklamalar
Bir sınıfın serileştirilebilir olması için bildirimi makroyu DECLARE_SERIAL
ve uygulama makroyu IMPLEMENT_SERIAL
içermelidir.
Not
Bu işlevi geçersiz kılma.
Örnek
Tüm CObject
örneklerde kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Kitaplığın Yayın sürümü için işleç, işleci delete
new
tarafından ayrılan belleği serbest bırakır.
void PASCAL operator delete(void* p);
void PASCAL operator delete(
void* p,
void* pPlace);
void PASCAL operator delete(
void* p,
LPCSTR lpszFileName,
int nLine);
Açıklamalar
Hata ayıklama sürümünde, operatör delete
bellek sızıntılarını algılamak için tasarlanmış bir ayırma izleme düzenine katılır.
Kod satırını kullanıyorsanız
#define new DEBUG_NEW
içindeki uygulamalarınızdan önce. CPP dosyası, ardından üçüncü sürümü delete
kullanılır ve dosya adı ve satır numarası daha sonra raporlama için ayrılan blokta depolanır. Ek parametreleri sağlama konusunda endişelenmenize gerek yoktur; bir makro bunu sizin için halleder.
Hata Ayıklama modunda kullanmasanız DEBUG_NEW
bile, yukarıda açıklanan kaynak dosya satır numarası raporlaması olmadan yine de sızıntı algılaması alırsınız.
ve delete
işleçlerini new
geçersiz kılarsanız, bu tanılama özelliğini kaybedersiniz.
Örnek
Örneklerde CObject
kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
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
Kitaplığın Yayın sürümü için işleç new
, benzer şekilde en uygun bellek ayırmayı malloc
yapar.
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);
Açıklamalar
Hata ayıklama sürümünde, operatör new
bellek sızıntılarını algılamak için tasarlanmış bir ayırma izleme düzenine katılır.
Kod satırını kullanıyorsanız
#define new DEBUG_NEW
içindeki uygulamalarınızdan önce. CPP dosyası, ardından ikinci sürümü new
kullanılır ve dosya adı ve satır numarası daha sonra raporlama için ayrılan blokta depolanır. Ek parametreleri sağlama konusunda endişelenmenize gerek yoktur; bir makro bunu sizin için halleder.
Hata Ayıklama modunda kullanmasanız DEBUG_NEW
bile, yukarıda açıklanan kaynak dosya satır numarası raporlaması olmadan yine de sızıntı algılaması alırsınız.
Not
Bu işleci geçersiz kılarsanız, öğesini de geçersiz kılmalısınız delete
. Standart kitaplık _new_handler
işlevini kullanmayın.
Örnek
Örneklerde CObject
kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
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
Bu nesneyi bir arşivden veya arşivden okur veya yazar.
virtual void Serialize(CArchive& ar);
Parametreler
ar
' CArchive
a veya 'den seri hale getirmek için bir nesne.
Açıklamalar
Seri hale getirmek istediğiniz her sınıf için geçersiz kılın Serialize
. Geçersiz kılınan Serialize
önce kendi temel sınıfının işlevini çağırmalıdır Serialize
.
Makroyu DECLARE_SERIAL
sınıf bildiriminizde ve makroyu IMPLEMENT_SERIAL
uygulamada da kullanmanız gerekir.
Arşivin yüklenip yüklenmediğini veya depolanıp depolmadığını belirlemek için veya CArchive::IsStoring
kullanınCArchive::IsLoading
.
Serialize
ve CArchive::WriteObject
tarafından CArchive::ReadObject
çağrılır. Bu işlevler ekleme işleci ( <<
) ve ayıklama işleci ( >>
) ile CArchive
ilişkilendirilir.
Serileştirme örnekleri için Bir Nesneyi Seri Hale Getirme makalesine bakın.
Örnek
Tüm CObject
örneklerde kullanılan sınıfın CAge
listesi için bkzCObList::CObList
.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}