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 では、複数の継承はサポートされていません。 派生クラスに含めることができる基底クラスは 1 つだけ CObject であり、階層内 CObject の左端に配置する必要があります。 ただし、右側の多重継承分岐で構造体と非 CObject派生クラスを持つことは許容されます。

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

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

第 2 レベルのマクロとIMPLEMENT_SERIALDECLARE_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.

解説

派生クラスごとに CObject1 つの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
派生クラスに CRuntimeClass 関連付 CObjectけられている構造体へのポインター。

戻り値

オブジェクトがクラスに対応する場合は 0 以外。それ以外の場合は 0。

解説

この関数は、(1) それが指定されたクラスのオブジェクトであるか、(2) 指定されたクラスから派生したクラスのオブジェクトであるかどうかをテスト pClass します。 この関数は、,、またはDECLARE_SERIALマクロでDECLARE_DYNAMICDECLARE_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::ReadObjectCArchive::WriteObject これらの関数は、挿入演算子 ( <<) および抽出演算子 ( >>) に関連付CArchiveけられています。

シリアル化の例については、オブジェクトのシリアル化に関する記事を参照してください。

すべてのCObject例で使用されるCAgeクラスの一覧を参照してくださいCObList::CObList

void CAge::Serialize(CArchive& ar)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())
      ar << m_years;
   else
      ar >> m_years;
}

関連項目

階層図