深入浅出MFC中99页写到: IMPLEMENT_DYNAMIC最美妙的地方在于使用了一个struct AFX_CLASSINIT结构,其定义如下:
struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass * pNewClass)
{
pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass=pNewClass;
}
}然后查了下MSDN发现没有AFX_CLASSINIT的定义,然后又在VS08里面找IMPLEMENT_DYNAMIC的宏定义,发现并没有使用这个结构。
然后想问一下:如果要用这个结构来做修改CRuntimeClass的操作,干嘛不直接写一个全局函数实现这个功能?还要搞个复杂的struct,然后用构造函数隐式地修改链表结构?
struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass * pNewClass)
{
pNewClass->m_pNextClass=CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass=pNewClass;
}
}然后查了下MSDN发现没有AFX_CLASSINIT的定义,然后又在VS08里面找IMPLEMENT_DYNAMIC的宏定义,发现并没有使用这个结构。
然后想问一下:如果要用这个结构来做修改CRuntimeClass的操作,干嘛不直接写一个全局函数实现这个功能?还要搞个复杂的struct,然后用构造函数隐式地修改链表结构?
解决方案 »
- 请问SendDlgItemMessage函数的几个语句分别是什么意思啊
- XTREME TOOLKIT中 如何对GIRD中的指定行制定列的控件隐藏(如有一列是放复选框控件的,我想在某条件下让它隐藏不显示)
- Listbox控件重绘时,获取文字乱码
- 钩子的问题?
- 在线等:求一个函数的最值
- Listctrl 显示数据闪屏
- 在使用chttpfile 类还获取网址上的内容的时候,在url为http ://www.163.com 或http://www.sina.com.cn 的时候 获得的文件内容为乱码呢?
- 给我一个在SystemTray显示一个图标的源代码(我只有1分)
- 我用MFC做了一个报表程序,开始时吧菜单中的“打印预览”删除了,请问我怎样再加入打印预览菜单项而且可以实现原来的功能?
- 每次开机 都让我忽略 这是为什么?
- 兔子党赶快加油,不能让cpp2017得逞
- mfc中的CList类不能嵌套使用吗?
1、类还有初始化?不是只有对象才有初始化吗?
2、类为什么要初始化?
3、在哪里初始化类?
4、到底是什么类在初始化?自己找答案,多看源码,即使新版MFC取消了这种方式,那也一定有更好的方式,最好单步跟踪代码执行过程。
假设
class Test:public CObject
{
DECLARE_DYNAMIC(Test)
}
IMPLEMENT_DYNAMIC(Test,CObject)void FuncInitClass(CRuntimeClass* pNewClass)
{
pNewClass-> m_pNextClass=CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass=pNewClass;
}
1.之所以不用全局函数实现修改CRuntimeClass中的pFirst指针,原因:
用全局函数FuncInitClass可以实现修改该指针,但是由于在全局范围内无法调用该函数,必须要在函数中才能调用该函数。(这个该书前几页,作者好像有提到过)如果在main()函数中调用该全局函数,则需要用户手动添加代码,而且需要让用户理解CRuntimeClass的内部实现。所以这种方法不可取。2.我在网上搜到过类似问题,有人问,为什么不在CRuntimeClass的构造函数里面执行这两个操作呢?
我试了下,是可以的。。
{
LPCSTR m_lpszClassName;
RunTimeClass* m_pBaseClass;
static RunTimeClass* pFirstClass;
RunTimeClass* m_pNextClass; RunTimeClass(LPCSTR name,RunTimeClass*,RunTimeClass*);
};
RunTimeClass* RunTimeClass::pFirstClass=NULL;//构造函数,实现初始化和修改链表的工作
RunTimeClass::RunTimeClass(LPCSTR name,RunTimeClass* base,RunTimeClass* next):m_lpszClassName(name),m_pBaseClass(base),m_pNextClass(next)
{
m_pNextClass=RunTimeClass::pFirstClass;
RunTimeClass::pFirstClass=this;
}class Base //基类
{
public:
static RunTimeClass classBase;
};static char _lpszBase[]="Base";
RunTimeClass Base::classBase(_lpszBase,NULL,NULL);
class Test:public Base //派生类
{
public:
static RunTimeClass classTest;
};
static char _lpszTest[]="Test";
RunTimeClass Test::classTest(_lpszBase,&Base::classBase,NULL);int main()
{
Test t;
return 0;
}
把宏变成了代码实现结果证实,CRuntimeClass的修改操作可以通过其构造函数实现,并非一定需要 AFX_CLASSINIT这个结构才能实现。
看了下VS2008中这个结构的代码,发现有些改变,但是做的操作大体上还是一样的。所以我觉得还是得问,定义这个结构,然后靠这个结构的构造函数取实现CRuntimeClass链表的修改操作,有什么意义呢?怎么感觉像是多此一举呢~?
您昨天的问题我想了一天多。。想来想去觉得有道理,但是好像又没关系~您指的类初始化是类静态成员的初始化吗?google baidu确实没搜到相关的资料。
被您这几个反问弄得茶饭不思啊~~~~诚心求教~~