次の方法で共有


CArchive::MapObject

更新 : 2007 年 11 月

ファイルに実際にシリアル化されない、参照のサブオブジェクトとして使用できるオブジェクトをマップに配置します。

void MapObject(
   const CObject* pOb 
);

パラメータ

  • pOb
    格納されるオブジェクトへの定数ポインタ。

解説

たとえば、ドキュメントをシリアル化せずに、ドキュメントの一部であるアイテムをシリアル化する場合があります。MapObject を呼び出すと、ドキュメントのアイテムまたはサブオブジェクトで、ドキュメントを参照できます。また、シリアル化されたサブアイテムでは、その m_pDocument バック ポインタをシリアル化できます。

CArchive オブジェクトを保存したり、このオブジェクトから読み込んだりする場合は、MapObject を呼び出します。MapObject は、シリアル化と逆シリアル化において CArchive オブジェクトが維持する内部データ構造体に指定されたオブジェクトを追加します。ただし、ReadObjectWriteObject とは異なり、オブジェクトに対してシリアル化は呼び出しません。

使用例

//MyDocument.h
class CMyDocument : public CDocument
{
public:
   DECLARE_SERIAL(CMyDocument)

   CObList m_listOfSubItems;

   virtual void Serialize(CArchive& ar);
};
//MyDocument.cpp
IMPLEMENT_SERIAL(CMyDocument, CDocument, 1)

void CMyDocument::Serialize(CArchive& ar)
{
   CDocument::Serialize(ar);

   if (ar.IsStoring())
   {
      // TODO: add storing code here
   }
   else
   {
      // TODO: add loading code here
   }

   ar.MapObject(this);  

   //serialize the subitems in the document;
   //they will be able to serialize their m_pDoc
   //back pointer
   m_listOfSubItems.Serialize(ar);
}
//SubItem.h
class CSubItem : public CObject
{
   DECLARE_SERIAL(CSubItem)
   CSubItem() : m_i(0) {};

public:
   CSubItem(CMyDocument * pDoc)
     { m_pDoc = pDoc; }

   // back pointer to owning document
   CMyDocument* m_pDoc; 
   WORD m_i; // other item data

   virtual void Serialize(CArchive& ar);
};
//SubItem.cpp
IMPLEMENT_SERIAL(CSubItem, CObject, 1);

void CSubItem::Serialize(CArchive& ar)

{
   if (ar.IsStoring())
   {
      // will serialize a reference 
      // to the "mapped" document pointer
      ar << (CObject *)m_pDoc;
      ar << m_i;
   }
   else
   {
      // Will load a reference to
      // the "mapped" document pointer
      ar >> (CObject *&) m_pDoc;
      ar >> m_i;
   }
}

必要条件

ヘッダー : afx.h

参照

参照

CArchive クラス

階層図

CArchive::ReadObject

CArchive::WriteObject

その他の技術情報

CArchive のメンバ