次の方法で共有


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 演算子。

解説

これは、 CFileCObListなどのライブラリ クラスだけでなく、記述するクラスのルートとしても機能します。 CObject は、次のような基本的なサービスを提供します。

  • シリアル化のサポート
  • ランタイム クラス情報
  • オブジェクト診断の出力
  • コレクション クラスとの互換性

CObject では、複数の継承はサポートされていません。 派生クラスは基底クラス CObject 1 つだけを持つ可能性があり、その CObject は階層内の左端に置く必要があります。 ただし、右側の多重継承分岐に構造体と非 CObject派生クラスを持つことは許容されます。

クラスの実装と宣言で省略可能なマクロの一部を使用すると、 CObject 派生の主な利点が得られます。

第 1 レベルのマクロ ( DECLARE_DYNAMICIMPLEMENT_DYNAMIC) は、クラス名とその階層内での位置への実行時アクセスを許可します。 これにより、意味のある診断ダンプが可能になります。

第 2 レベルのマクロ ( DECLARE_SERIALIMPLEMENT_SERIAL) には、第 1 レベルのマクロのすべての機能が含まれており、オブジェクトを "アーカイブ" との間で "シリアル化" できます。

Microsoft Foundation クラスと C++ クラスの一般的な派生と CObjectの使用については、「 CObject の使用Serializationを参照してください。

継承階層

CObject

要件

ヘッダー: afx.h

CObject::AssertValid

このオブジェクトの整合性を検証します。

virtual void AssertValid() const;

解説

AssertValid は、内部状態を確認することによって、このオブジェクトに対して有効性チェックを実行します。 ライブラリのデバッグ バージョンでは、 AssertValid がアサートし、アサーションが失敗した行番号とファイル名を示すメッセージでプログラムを終了できます。

独自のクラスを記述するときは、 AssertValid 関数をオーバーライドして、自分とクラスの他のユーザーに診断サービスを提供する必要があります。 オーバーライドされた AssertValid は、通常、派生クラスに固有のデータ メンバーをチェックする前に、基底クラスの AssertValid 関数を呼び出します。

AssertValidconst関数であるため、テスト中にオブジェクトの状態を変更することはできません。 関数 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ステートメントで角かっこで囲む必要があります。

Dumpconst関数であるため、ダンプ中にオブジェクトの状態を変更することはできません。

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_DYNAMICIMPLEMENT_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_DYNAMICDECLARE_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;
}

関連項目

階層図