0

mfcなど、追加する必要があります

DECLARE_SERIAL(CGraph)

もし私がクラスを持っているなら、

class A
{
    int a,b;
};

a と b の値をファイルに保存してから読み取ることができます。だから、なぜ DECLARE_SERIAL(CGraph) が使われたのか理解できませんでした。

4

1 に答える 1

2

DECLARE_SERIALおよびマクロは、MFC によって提供されるフレームワークを使用してポリモーフィックにシリアル化したいIMPLEMENT_SERIALクラスから派生したクラスにのみ必要です。CObject

クラスがから派生していない場合、CObjectおよび/または MFC のシリアル化をポリモーフィックに (つまり、へのポインターを介して) 使用したくない場合はCObject、もちろん、当然のことながら独自のソリューションを実装できます。

たとえばDECLARE_SERIAL(CMyClass)、クラス宣言に入る次のコードに展開されます

protected: 
    static CRuntimeClass* __stdcall _GetBaseClass(); 
public: 
    static CRuntimeClass classCMyClass; 
    static CRuntimeClass* __stdcall GetThisClass(); 
    virtual CRuntimeClass* GetRuntimeClass() const; 
    static CObject* __stdcall CreateObject();  
    friend CArchive& __stdcall operator>>(CArchive& ar, CMyClass* &pOb);

IMPLEMENT_SERIAL(CMyClass, CObject, VERSIONABLE_SCHEMA | 1)cppファイルに入る次のコードに展開されます

CObject* __stdcall CMyClass::CreateObject() 
{ 
    return new CMyClass; 
} 

extern AFX_CLASSINIT _init_CMyClass; 

CRuntimeClass* __stdcall CMyClass::_GetBaseClass() 
{ 
    return (CObject::GetThisClass()); 
}

__declspec(selectany) CRuntimeClass CMyClass::classCMyClass = 
{ 
    "CMyClass", sizeof(class CMyClass), (0x80000000) | 1, 
    CMyClass::CreateObject, &CMyClass::_GetBaseClass, 0, &_init_CMyClass 
}; 

CRuntimeClass* __stdcall CMyClass::GetThisClass() 
{ 
    return ((CRuntimeClass*)(&CMyClass::classCMyClass)); 
} 

CRuntimeClass* CMyClass::GetRuntimeClass() const 
{ 
    return ((CRuntimeClass*)(&CMyClass::classCMyClass)); 
} 

AFX_CLASSINIT _init_CMyClass((CMyClass::GetThisClass())); 

CArchive& __stdcall operator>>(CArchive& ar, CMyClass* &pOb) 
{ 
    pOb = (CMyClass*) ar.ReadObject((CMyClass::GetThisClass())); 
    return ar;
}

MSDNに記載されているように、上記のマクロを使用せずにシリアル化を使用することもできます。

MSDN

于 2013-06-22T09:02:54.840 に答える