MFC ライブラリの重要な基底クラスです。
構文
class AFX_NOVTABLE CObject
メンバー
保護されたコンストラクター
| 名前 | 説明 |
|---|---|
CObject::CObject |
既定のコンストラクターです。 |
パブリック メソッド
| 名前 | 説明 |
|---|---|
CObject::AssertValid |
このオブジェクトの整合性を検証します。 |
CObject::Dump |
このオブジェクトの診断ダンプを生成します。 |
CObject::GetRuntimeClass |
このオブジェクトのクラスに対応する CRuntimeClass 構造体を返します。 |
CObject::IsKindOf |
このオブジェクトの特定のクラスとの関係をテストします。 |
CObject::IsSerializable |
このオブジェクトをシリアル化できるかどうかをテストします。 |
CObject::Serialize |
アーカイブからオブジェクトを読み込むか、アーカイブに格納します。 |
パブリック演算子
| 名前 | 説明 |
|---|---|
CObject::operator delete |
特殊な delete 演算子。 |
CObject::operator new |
特殊な new 演算子。 |
解説
これは、 CFile や CObListなどのライブラリ クラスだけでなく、記述するクラスのルートとしても機能します。 CObject は、次のような基本的なサービスを提供します。
- シリアル化のサポート
- ランタイム クラス情報
- オブジェクト診断の出力
- コレクション クラスとの互換性
CObject では、複数の継承はサポートされていません。 派生クラスは基底クラス CObject 1 つだけを持つ可能性があり、その CObject は階層内の左端に置く必要があります。 ただし、右側の多重継承分岐に構造体と非 CObject派生クラスを持つことは許容されます。
クラスの実装と宣言で省略可能なマクロの一部を使用すると、 CObject 派生の主な利点が得られます。
第 1 レベルのマクロ ( DECLARE_DYNAMIC と IMPLEMENT_DYNAMIC) は、クラス名とその階層内での位置への実行時アクセスを許可します。 これにより、意味のある診断ダンプが可能になります。
第 2 レベルのマクロ ( DECLARE_SERIAL と IMPLEMENT_SERIAL) には、第 1 レベルのマクロのすべての機能が含まれており、オブジェクトを "アーカイブ" との間で "シリアル化" できます。
Microsoft Foundation クラスと C++ クラスの一般的な派生と CObjectの使用については、「 CObject の使用 と Serializationを参照してください。
継承階層
CObject
要件
ヘッダー: afx.h
CObject::AssertValid
このオブジェクトの整合性を検証します。
virtual void AssertValid() const;
解説
AssertValid は、内部状態を確認することによって、このオブジェクトに対して有効性チェックを実行します。 ライブラリのデバッグ バージョンでは、 AssertValid がアサートし、アサーションが失敗した行番号とファイル名を示すメッセージでプログラムを終了できます。
独自のクラスを記述するときは、 AssertValid 関数をオーバーライドして、自分とクラスの他のユーザーに診断サービスを提供する必要があります。 オーバーライドされた AssertValid は、通常、派生クラスに固有のデータ メンバーをチェックする前に、基底クラスの AssertValid 関数を呼び出します。
AssertValidはconst関数であるため、テスト中にオブジェクトの状態を変更することはできません。 関数 AssertValid 独自の派生クラスは、例外をスローするのではなく、無効なオブジェクト データを検出するかどうかをアサートする必要があります。
"validity" の定義は、オブジェクトのクラスによって異なります。 原則として、関数は "浅いチェック" を行う必要があります。つまり、オブジェクトに他のオブジェクトへのポインターが含まれている場合は、ポインターが NULLされていないかどうかを確認する必要がありますが、ポインターによって参照されるオブジェクトに対して有効性テストを実行しないでください。
例
すべてのCObject例で使用されるCAge クラスの一覧については、CObList::CObListを参照してください。
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
別の例については、「AfxDoForAllObjects」を参照してください。
CObject::CObject
これらの関数は、標準の CObject コンストラクターです。
CObject();
CObject(const CObject& objectSrc);
パラメーター
objectSrc
別の参照 CObject
解説
既定のバージョンは、派生クラスのコンストラクターによって自動的に呼び出されます。
クラスがシリアル化可能な場合 ( IMPLEMENT_SERIAL マクロが組み込まれています)、クラス宣言に既定のコンストラクター (引数のないコンストラクター) が必要です。 既定のコンストラクターが必要ない場合は、プライベートまたは保護された "空" コンストラクターを宣言します。 詳細については、「CObjectの使用」を参照してください。
標準の C++ の既定のクラス コピー コンストラクターは、メンバーごとのコピーを実行します。 プライベート CObject コピー コンストラクターが存在すると、クラスのコピー コンストラクターが必要であっても使用できない場合、コンパイラ エラー メッセージが保証されます。 クラスにこの機能が必要な場合は、コピー コンストラクターを指定します。
例
CObjectの例で使用されるCAge クラスの一覧については、CObList::CObListを参照してください。
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
オブジェクトの内容を CDumpContext オブジェクトにダンプします。
virtual void Dump(CDumpContext& dc) const;
パラメーター
dc
ダンプの診断ダンプ コンテキスト (通常は afxDump。
解説
独自のクラスを記述するときは、 Dump 関数をオーバーライドして、自分とクラスの他のユーザーに診断サービスを提供する必要があります。 オーバーライドされた Dump は、通常、派生クラスに固有のデータ メンバーを出力する前に、基底クラスの Dump 関数を呼び出します。 CObject::Dump クラスが IMPLEMENT_DYNAMIC または IMPLEMENT_SERIAL マクロを使用している場合は、クラス名を出力します。
Note
Dump関数では、出力の最後に改行文字を出力しないでください。
Dump 呼び出しは、Microsoft Foundation クラス ライブラリのデバッグ バージョンでのみ意味があります。 呼び出し、関数宣言、および関数の実装は、条件付きコンパイル用の#ifdef _DEBUG#endifステートメントで角かっこで囲む必要があります。
Dumpはconst関数であるため、ダンプ中にオブジェクトの状態を変更することはできません。
CDumpContext挿入 (<<) 演算子はCObject ポインターが挿入されたときにDumpを呼び出します。
Dump では、オブジェクトの "非循環" ダンプのみが許可されます。 たとえば、オブジェクトのリストをダンプすることはできますが、オブジェクトの 1 つがリスト自体である場合は、最終的にスタックがオーバーフローします。
例
すべてのCObject例で使用されるCAge クラスの一覧については、CObList::CObListを参照してください。
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
このオブジェクトのクラスに対応する CRuntimeClass 構造体を返します。
virtual CRuntimeClass* GetRuntimeClass() const;
戻り値
このオブジェクトのクラスに対応する CRuntimeClass 構造体へのポインター。 NULLされません。
解説
CObject派生クラスごとに 1 つのCRuntimeClass構造体があります。 構造体のメンバーは次のとおりです。
LPCSTR m_lpszClassNameASCII クラス名を含む null で終わる文字列。int m_nObjectSizeオブジェクトのサイズ (バイト単位)。 割り当てられたメモリを指すデータ メンバーがオブジェクトにある場合、そのメモリのサイズは含まれません。UINT m_wSchemaスキーマ番号 ( -1 for nonserializable classes). スキーマ番号の説明については、IMPLEMENT_SERIALマクロを参照してください。CObject* (PASCAL* m_pfnCreateObject)()クラスのオブジェクトを作成する既定のコンストラクターへの関数ポインター (クラスが動的な作成をサポートしている場合にのみ有効です。それ以外の場合は、NULLを返します)。CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()アプリケーションが MFC の AFXDLL バージョンに動的にリンクされている場合は、基底クラスのCRuntimeClass構造体を返す関数へのポインター。CRuntimeClass* m_pBaseClassアプリケーションが MFC に静的にリンクされている場合は、基底クラスのCRuntimeClass構造体へのポインター。
この関数では、クラス実装で IMPLEMENT_DYNAMIC、 IMPLEMENT_DYNCREATE、または IMPLEMENT_SERIAL マクロを使用する必要があります。 そうしないと、正しくない結果が得られます。
例
すべてのCObject例で使用されるCAge クラスの一覧については、CObList::CObListを参照してください。
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
このオブジェクトの特定のクラスとの関係をテストします。
BOOL IsKindOf(const CRuntimeClass* pClass) const;
パラメーター
pClass
CObject派生クラスに関連付けられているCRuntimeClass構造体へのポインター。
戻り値
オブジェクトがクラスに対応する場合は 0 以外。それ以外の場合は 0。
解説
この関数は pClass をテストして、(1) それが指定されたクラスのオブジェクトであるか、(2) 指定されたクラスから派生したクラスのオブジェクトであるかどうかを確認します。 この関数は、 DECLARE_DYNAMIC、 DECLARE_DYNCREATE、または DECLARE_SERIAL マクロで宣言されたクラスでのみ機能します。
この関数は C++ ポリモーフィズム機能を使用しないため、広く使用しないでください。 代わりに仮想関数を使用してください。
例
すべてのCObject例で使用されるCAge クラスの一覧については、CObList::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
このオブジェクトがシリアル化の対象かどうかをテストします。
BOOL IsSerializable() const;
戻り値
このオブジェクトをシリアル化できる場合は 0 以外。それ以外の場合は 0。
解説
クラスをシリアル化できるようにするには、その宣言に DECLARE_SERIAL マクロを含める必要があり、実装には IMPLEMENT_SERIAL マクロが含まれている必要があります。
Note
この関数はオーバーライドしないでください。
例
すべてのCObject例で使用されるCAge クラスの一覧については、CObList::CObListを参照してください。
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
ライブラリのリリース バージョンの場合、演算子 delete は、演算子 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);
解説
デバッグ バージョンでは、オペレーター delete は、メモリ リークを検出するように設計された割り当て監視スキームに参加します。
コード行を使用する場合
#define new DEBUG_NEW
内の実装の前に.CPP ファイルでは、3 番目のバージョンの delete が使用され、後でレポートするために割り当てられたブロックにファイル名と行番号が格納されます。 追加のパラメーターの指定について心配する必要はありません。マクロが自動的に処理します。
デバッグ モードで DEBUG_NEW を使用しない場合でも、リーク検出は行われますが、前述のソース ファイルの行番号レポートはありません。
new演算子をオーバーライドしてdeleteすると、この診断機能は失います。
例
CObjectの例で使用されるCAge クラスの一覧については、CObList::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
ライブラリのリリース バージョンの場合、演算子 new は、 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);
解説
デバッグ バージョンでは、オペレーター new は、メモリ リークを検出するように設計された割り当て監視スキームに参加します。
コード行を使用する場合
#define new DEBUG_NEW
内の実装の前に.CPP ファイルを使用すると、2 番目のバージョンの new が使用され、後でレポートするために割り当てられたブロックにファイル名と行番号が格納されます。 追加のパラメーターの指定について心配する必要はありません。マクロが自動的に処理します。
デバッグ モードで DEBUG_NEW を使用しない場合でも、リーク検出は行われますが、前述のソース ファイルの行番号レポートはありません。
Note
この演算子をオーバーライドする場合は、 deleteもオーバーライドする必要があります。 標準ライブラリの _new_handler 関数は使用しないでください。
例
CObjectの例で使用されるCAge クラスの一覧については、CObList::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
アーカイブに対して、このオブジェクトの読み取りまたは書き込みを行います。
virtual void Serialize(CArchive& ar);
パラメーター
ar
シリアル化の対象となる CArchive オブジェクト。
解説
シリアル化するクラスごとに Serialize をオーバーライドします。 オーバーライドされた Serialize は、まず基底クラスの Serialize 関数を呼び出す必要があります。
また、クラス宣言で DECLARE_SERIAL マクロを使用し、実装で IMPLEMENT_SERIAL マクロを使用する必要があります。
CArchive::IsLoadingまたはCArchive::IsStoringを使用して、アーカイブが読み込まれているか格納されているかを判断します。
Serialize は、 CArchive::ReadObject および CArchive::WriteObjectによって呼び出されます。 これらの関数は、 CArchive 挿入演算子 ( <<) と抽出演算子 ( >>) に関連付けられます。
シリアル化の例については、「オブジェクトのシリアル化に関する記事を参照してください。
例
すべてのCObject例で使用されるCAge クラスの一覧については、CObList::CObListを参照してください。
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}