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
では、複数の継承はサポートされていません。 派生クラスに含めることができる基底クラスは 1 つだけ CObject
であり、階層内 CObject
の左端に配置する必要があります。 ただし、右側の多重継承分岐で構造体と非 CObject
派生クラスを持つことは許容されます。
クラスの実装と宣言で省略可能なマクロの一部を使用すると、派生の主な利点 CObject
が得られます。
第 1 レベルのマクロとIMPLEMENT_DYNAMIC
、DECLARE_DYNAMIC
クラス名とその階層内での位置への実行時アクセスを許可します。 これにより、意味のある診断ダンプが可能になります。
第 2 レベルのマクロとIMPLEMENT_SERIAL
、DECLARE_SERIAL
第 1 レベルのマクロのすべての機能が含まれており、"アーカイブ" との間でオブジェクトを "シリアル化" できるようにします。
一般的な Microsoft Foundation クラスと C++ クラスの派生と使用CObject
については、「CObject とシリアル化の使用」を参照してください。
継承階層
CObject
必要条件
ヘッダー:afx.h
CObject::AssertValid
このオブジェクトの整合性を検証します。
virtual void AssertValid() const;
解説
AssertValid
は、内部状態をチェックすることによって、このオブジェクトに対して有効性チェックを実行します。 ライブラリのデバッグ バージョンでは、 AssertValid
アサーションが失敗した行番号とファイル名を示すメッセージでプログラムをアサートして終了できます。
独自のクラスを記述するときは、関数を AssertValid
オーバーライドして、自分とクラスの他のユーザーに診断サービスを提供する必要があります。 通常、オーバーライドAssertValid
されたメソッドは、派生クラスに固有のデータ メンバーをチェックする前に、基底クラスの関数を呼び出AssertValid
します。
const
関数であるためAssertValid
、テスト中にオブジェクトの状態を変更することはできません。 独自の派生クラス 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_SERIAL
マクロを使用する場合は、クラス名をIMPLEMENT_DYNAMIC
出力します。
Note
関数 Dump
では、出力の最後に改行文字を出力しないでください。
Dump
呼び出しは、Microsoft Foundation クラス ライブラリのデバッグ バージョンでのみ意味があります。 条件付きコンパイルでは、呼び出し、関数宣言、および関数実装を 、#endif
ステートメントで角かっこで#ifdef _DEBUG
囲む必要があります。
関数const
であるためDump
、ダンプ中にオブジェクトの状態を変更することはできません。
ポインターが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
派生クラスに CRuntimeClass
関連付 CObject
けられている構造体へのポインター。
戻り値
オブジェクトがクラスに対応する場合は 0 以外。それ以外の場合は 0。
解説
この関数は、(1) それが指定されたクラスのオブジェクトであるか、(2) 指定されたクラスから派生したクラスのオブジェクトであるかどうかをテスト pClass
します。 この関数は、,、またはDECLARE_SERIAL
マクロでDECLARE_DYNAMIC
DECLARE_DYNCREATE
宣言されたクラスでのみ機能します。
この関数は 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;
}
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示