• 25、深入浅出MFC学习笔记,DocumentView再学习(2)


    1、型录网就是CRuntimeClass组成的一个链表。应用程序使用DECLARE_SERIALIMPLEMENT_SERIAL两个宏,就获得文件读写以及动态创建两种机制。

    wps_clip_image-15145

    2Serializable的必要条件

        欲让一个对象有Serialize能力,它必须派生自一个Serializable类,一个类意欲成为Serializable,必须有下列五大条件:

      1)从CObject派生下来,如此以来可保有RTTIDynamic Creation等机能。

      2)类的声明部分必须有DECLARE_SERIAL宏。此宏需要一个参数:类名称。

      3)类的实现部分必须有IMPLEMENT_SERIAL宏。此宏需要三个参数:一是类名称,二是基类名称,三是schema no.

      4)改写Serialize虚拟函数、使它能够适当地把类的成员变量写入档案中。

      5)为此类加上一个default构造函数(也就是无参之构造函数)。因为若一个对象来自档案,MFC必须先动态生成它,而且是没有任何参数的情况下调用其构造函数,然后才从档案中读出对象数据。

    一个C++类如果希望有Serialization机制,它的第一件就是直接或间接派生自CObject,为的是继承下列三个运算符:[1,P399]

    // in AFX.INL
    _AFX_INLINE CArchive& AFXAPI operator<<(CArchive& ar, const CObject* pOb)
    { ar.WriteObject(pOb); return ar; }
    _AFX_INLINE CArchive& AFXAPI operator>>(CArchive& ar, CObject*& pOb)
    { pOb = ar.ReadObject(NULL); return ar; }
    _AFX_INLINE CArchive& AFXAPI operator>>(CArchive& ar, const CObject*& pOb)
    { pOb = ar.ReadObject(NULL); return ar; }
    

    第二个就是使用SERIAL宏,并且在类声明中加上:

    friend CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb);
    

    在类的应用程序文件中加上:

    CArchive& AFXAPI operator>>(CArchive& ar, class_name* &pOb) \
    { pOb = (class_name*) ar.ReadObject(RUNTIME_CLASS(class_name)); \
    return ar; } \
    

    示例如下

    class CStroke : public CObject
    {
    ...
    DECLARE_SERIAL(CStroke)
    }
    IMPLEMENT_SERIAL(CStroke, CObject, 1)
    
    class CStroke : CObject
    {
    ...
    friend CArchive& AFXAPI operator>>(CArchive& ar, CStroke* &pOb);
    }
    
    CArchive& AFXAPI operator>>(CArchive& ar, CStroke* &pOb)
    { 
    pOb = (CStroke*) ar.ReadObject(RUNTIME_CLASS(CStroke));
    return ar; 
    }
    

    3CArchive类是文件之前的一个内存缓冲区。

    4、自定义SERIAL宏给抽象类使用[1,P401]

    参考

    [1] 深入浅出MFC

    [2] MFC Technical Notes

    http://msdn.microsoft.com/en-us/library/h6h0eact%28VS.80%29.aspx

    [3] http://www.cnblogs.com/mydomain/archive/2011/02/26/1966034.html

  • 相关阅读:
    数据库之小问题
    网络基础
    react-fiber 解析
    【like-react】手写一个类似 react 的框架
    istat menus 序列号
    Git学习
    JavaScript设计模式与开发实践【第一部分】
    javascript 原生bind方法实现
    requirejs 学习
    mac 安装maven+eclipse
  • 原文地址:https://www.cnblogs.com/mydomain/p/1966304.html
Copyright © 2020-2023  润新知