文章列表
 
您正在查看 "visual c++" 分类下的文章

2007年08月23日 星期四 16:50
写了几天的代码, 语法格式全用的是C99的, 在linux下用gcc编译通过.
同事将程序拿过去, 进行模块合并, 我的那几个程序竟然在vs2005下无法编译, 发现vs2005对c99标准支持得不好.
 
2007年01月18日 星期四 14:18

今天发现并不是在任何情况下, 智能指针都不需要显式的释放.

在主函数中申请的智能指针, 在调用CoUninitialize()函数之前必须全部释放.

 
2007年01月03日 星期三 19:25

1.CObject类的定义
CObject 是 MFC 最基本的类, 大多数 MFC 类的都由它直接或间接派生而来.
CObject 类有很多有用的特性: 对运行时类信息的支持, 对动态创建的支持, 对串行化的支
持, 对象诊断输出, 等等. MFC 从 CObject 派生出许多类, 具备其中的一个或者多个特性.
也可以从 CObject 类派生出自己的类, 以利用 CObject 类的这些特性.

class CObject
{
  / * 方法 */
  public:
    /* 与动态创建相关的函数 */
    virtual CRuntimeClass * GetRuntimeClass() const;
    /* 析构函数 */
    virtual ~CObject();
    
    /* 与构造函数相关的内存分配函数 */
    void * PASCAL operator new( size_t nSize );
    void * PASCAL operator new( size_t, void * p);
    void PASCAL operator delete( void * p );
    #if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)
    void * PASCAL operator new( size_t nSize, LPCSTR lpszFileName, int nLine );
    #endif
    
  protected:
    CObject();
    
  private:
    /* 复制构造函数和赋值构造函数是不可用的 */
    /* 复制构造函数, 私有 */
    CObject( const CObject& objectSrc );
    /* 赋值构造函数, 私有 */
    void operator=(const CObject& objectSrc);
    
  /* 属性 */
  public:
    /* 与运行时类信息, 串行化相关的函数 */
    BOOL IsSerializable() const;
    BOOL IsKindOf( const CRuntimeClass * pClass ) const;
    virtual void Serialize( CArchive& ar );
    
    /* 诊断函数 */
    virtual void AssertValid() const;
    virtual void Dump( CDumpContext& dc ) const;
    
  public:
    /* 与动态创建对象相关的函数 */
    static const AFX_DATA CRuntimeClass classCObject;
    
    #ifdef _AFXDLL
    static CRuntimeClass * PASCAL _GetBaseClass();
    #endif
};

五个虚拟函数: 析构函数, GetRuntimeClass, Serialize, AssertValid, Dump. 这些虚拟
函数, 在CObject的派生类中应该有更具体的实现, 有可能在实现它们的时候要求先调用基
类的实现, 例如 Serialize 和 Dump.

2.CObject类的特性
(1)对运行时类信息的支持
这个特性用于在运行时确定一个对象是否属于一个特定的类, 即是否是该类或该类的子类的
对象实例. IsKindOf 函数用于实现这个功能.
从 CObject 派生的类要具有这样的特性, 需要:
. 定义该类时, 在类说明中使用 DECLARE_DYNAMIC(CLASSNAME) 宏;
. 在类的实现文件中使用 IMPLEMENT_DYNAMIC( CLASSNAME, BASECLASS ) 宏.
(2)对动态创建的支持
动态创建,就是运行时创建指定类的实例. 在MFC中大量使用, 如框架窗口对象, 视对象, 还
有文档对象都需要文档模板类(CDocTemplate)对象来动态的创建.
从 CObject 派生的类要具有动态创建的功能, 需要:
. 定义该类时, 在类说明中使用 DECLARE_DYNCREATE(CLASSNAME) 宏;
. 定义一个不带参数的构造函数(默认构造函数);
. 在类的实现文件中使用 IMPLEMENT_DYNCREATE(CLASSNAME, BASECLASS) 宏;
. 使用时先通过宏RUNTIME_CLASS得到类的RunTime信息, 然后使用 CRuntimeClass 成员函
数 CreateObject 创建一个该类的实例.

e.g:
  CRuntimeClass * pRuntimeClass = RUNTIME_CLASS( CName );
  CObject * pObject = pRuntimeClass->CreateObject();
  //CName 必须有一个缺省构造函数
  //用 IsKindOf 检测是否是CName类的实例
  Assert( pObject->IsKindOf( RUNTIME_CLASS(CName) ) );
  
(3)对序列化的支持
"序列化"就是把对象内容存入一个文件或从一个文件中读取对象内容的过程. 从 CObject
派生的类要具有序列化的功能,需要:
. 定义该类时, 在类说明中使用 DECLARE_SERIAL(CLASSNAME) 宏;
. 定义一个不带参数的构造函数(默认构造函数);
. 在类的实现文件中使用 IMPLEMENT_SERIAL(CLASS, BASECLASS) 宏;
. 覆盖 Serialize 成员函数.
(如果直接调用Serialize函数进行序列化读写, 可以省略前面三步.)

以运行时类信息的支持, 动态创建的支持, 串行化的支持层(不包括直接调用Serialize实现
序列化), 这三种功能的层次依次升高. 如果要对后面的功能支持, 必定对前面的功能支持.
支持动态创建的话, 必定支持运行时类信息; 支持序列化, 必定支持前面的两个功能, 因为
它们的声明和实现都是后者包含前者.

e.g:
  class CPerson : public CObject
  {
    public:
      DECLARE_SERIAL( CPerson )
      CPerson()
      {
        m_name   = "";
        m_number = 0;
      }
      CString m_name;
      WORD m_number;
      void Serialize( CArchive& archive );
  };
  
  void CPerson::Serialize( CArchive& archive )
  {
    CObject::Serialize( archive );
    if( archive.IsStoring() )
      archive << m_name << m_number;
    else
      archive >> m_name >> m_number;
  }
  

 
 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

[表情]
 

问题解决,谢谢分享~
 

做了没有?
 

太长知识了,这两天我也老犯这毛病
 

非常感谢~学习了~
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu