在MFC编程中,没有实例化的类竟可以调成员函数,为什么???class CRoundDlg : public CDialog
{
...
afx_msg UINT OnNcHitTest(CPoint point);
...
}UINT CRoundDlg::OnNcHitTest(CPoint point) 
{
UINT nHitTest=CDialog::OnNcHitTest (point);
//该处若写成UINT nHitTest=CRoundDlg::OnNcHitTest (point);则出现非法操作
//此处CDialog类在那实例化?竟然何以调用该类的成员函数??请赐教!!!
 
return (nHitTest == HTCLIENT)? HTCAPTION: nHitTest;
}

解决方案 »

  1.   

    搞清楚,你的类是从CDialog派生的,派生类可以任意调用基类的成员函数,因为这里有一个默认前提,就是只要你的派生类实例化了,开始运行,其基类必然先与此类而实例化的
    还有一种情况就是,一个类拥有静态成员函数,这种成员函数可以不需要实例化而直接运行,MFC有很多这方面的例子
      

  2.   

    如果写成:UINT nHitTest=CRoundDlg::OnNcHitTest (point);就会无穷递归,当然非法操作(栈溢出?)实例肯定有,如果没有实例,MFC不会掉用这个函数。这个函数在DoModal后才调用的,已经实例化了。
      

  3.   

    按理说,这个函数在DoModal后才调用的,已经实例化了,
    用CRoundDlg类调用它的成员函数也应该是可以的,可是为什么调用
    UINT nHitTest=CRoundDlg::OnNcHitTest (point);
    就会无穷递归,当然非法操作(栈溢出?)
    不解,请赐教!!!
      

  4.   

    问题是CRoundDlg::OnNcHitTest不是调用其他函数,而是调用自己,没有递归退出条件,当然是无穷递归。CRoundDlg::OnNcHitTest应该是一个消息的响应函数,当WM_NCHITTEST消息发送到对话框的时候调用,前提是对话框必须存在,才会存在这个消息,但是对话框是CRoundDlg::DoModal创建的,因此CRoundDlg得实例存在,否则DoModal无法调用。