关于MFC:CObject中的Dump()用法疑点
关于MFC::CObject中的Dump()用法疑问
诶嘛 累死了 手打的 咳咳 接下来 就是问题啦
CPerson(CString name)
:_name(name)
这句是什么意思 求详细解释
virtual void Dump(CDumpCOntext& dc) const
{
CObject::Dump(dc);
dc << (LPCTSTR)_name;
}
中的 dc是什么标示符 是本身定义的还是干吗的 dc的作用是什么 在下面<<是起到什么作用。在CObject::Dump(dc);
中参数是起什么作用。
DECLARE_DYNAMIC(CPerson) 和IMPLEMENT_DYNAMIC(CPerson,CObject)
为什么左面的一个参数右面的两个 况且 他俩不是一个意思么。
afx.Dump.SetDepth(1);
还有 怎么dump调用变成这样了 这句是啥意思。
没啦 求大手子 给讲讲 小子刚学 好多地方不懂 嘿嘿。
------解决方案--------------------
第一个是将构造函数的name参数传给_name变量。
顾名思义,dc就是dump context,所谓 context 就是上下文。
dump是一个接力的过程,先让自己的基类输出,然后自己输出。而自己的派生类会调用自己,这样可以保证全部内容都输出出来。
<<是输出流运算符,dump输出到流上,这样的好处是,它可以兼容显示器、文件、网络等等各种输出形式。
DECLARE_DYNAMIC这个是宏,具体看侯捷的深入浅出mfc的rtti部分。
SetDepth可以防止无限递归。比如说一个双向链表的节点对象,如果无限制转储,那么前一个节点输出后一个,后一个再输出前一个,那就没完了。
#include "stdafx.h"
class CPerson : public CObject
{
DECLARE_DYNAMIC(CPerson)
private:
CString _name;
public:
CPerson(CString name)
:_name(name)
{
}
virtual void Dump(CDumpCOntext& dc) const
{
CObject::Dump(dc);
dc << (LPCTSTR)_name;
}
};
IMPLEMENT_DYNAMIC(CPerson,CObject)
int _tmain()
{
#if _DEBUG
afx.Dump.SetDepth(1);
#endif
CWnd *pWnd = new CWnd();
CPerson *pPerson = new CPerson(_T("bluejoe"));
return 0;
}
诶嘛 累死了 手打的 咳咳 接下来 就是问题啦
CPerson(CString name)
:_name(name)
这句是什么意思 求详细解释
virtual void Dump(CDumpCOntext& dc) const
{
CObject::Dump(dc);
dc << (LPCTSTR)_name;
}
中的 dc是什么标示符 是本身定义的还是干吗的 dc的作用是什么 在下面<<是起到什么作用。在CObject::Dump(dc);
中参数是起什么作用。
DECLARE_DYNAMIC(CPerson) 和IMPLEMENT_DYNAMIC(CPerson,CObject)
为什么左面的一个参数右面的两个 况且 他俩不是一个意思么。
afx.Dump.SetDepth(1);
还有 怎么dump调用变成这样了 这句是啥意思。
没啦 求大手子 给讲讲 小子刚学 好多地方不懂 嘿嘿。
------解决方案--------------------
第一个是将构造函数的name参数传给_name变量。
顾名思义,dc就是dump context,所谓 context 就是上下文。
dump是一个接力的过程,先让自己的基类输出,然后自己输出。而自己的派生类会调用自己,这样可以保证全部内容都输出出来。
<<是输出流运算符,dump输出到流上,这样的好处是,它可以兼容显示器、文件、网络等等各种输出形式。
DECLARE_DYNAMIC这个是宏,具体看侯捷的深入浅出mfc的rtti部分。
SetDepth可以防止无限递归。比如说一个双向链表的节点对象,如果无限制转储,那么前一个节点输出后一个,后一个再输出前一个,那就没完了。