CObject
クラス
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_lpszClassName
ASCII クラス名を含む 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;
}