Visual C++ 6.0 & Windows 20001、交叉引用头文件是错误的?
发生错误时的情景:    创建一个MFC基于对话框的工程,假设对话框资源的ID是 IDD_DIALOG_BASE ,类名是 CDialogBase ,声明在 DialogBase.h ,实现在 Dialogbase.cpp 。
    然后又新建了一个对话框资源,这个对话框资源的ID是 IDD_DIALOG_NEW ,类名是 CDialogNew ,声明在 DialogNew.h ,实现在 DialogNew.cpp 。    我在 CDialogBase 类中定义了一个 CDialogNew 的对象 m_wndDialogNew 。(使用ClassWizard自动创建,它帮我在 DialogBase.h 前面加上了“ #include "DialogNew.h" ”。然后我又在 CDialogNew 中定义了一个 CDialogBase 对象 m_wndDialogBase (使用ClassWizard自动创建,它并不自动帮我在 DialogNew.h 前面加上“ #include "DialogBase.h" ”,所以此时编译会失败,我手动添加上)。    编译,此时出现问题。错误在 DialogBase.h 中定义 m_wndDialogNew 的一行:        大致情形是这样的:        protect:
            CDialogNew m_wndDialogNew;    错误信息表明编译器不认为 CDialogNew 是一个类,它说 m_wndDialogNew 的定义缺乏存储类型。    经调试,我发现是 DailogNew.h 中的 #include "DialogBase.h" 引发的问题。    请问产生这种问题的真正原因是什么?2、如何让两个有父子关系的对话框交换数据?(模型接上文)
    在新的模态对话框中,我需要返回一些内容给原对话框,即要实现两对话框的通信,从 CDialogBase 中访问 CDialogNew 的访问是很简单的,因为它的对象 m_wndDialogNew 是 CDialogBase 对象的成员。但如何从 CDialogNew 的对象访问 CDialogBase 的对象就成了难题。    我发现如果子对话框是使用 DoModal() 方法创建的,那么在子对话框中可以简单地调用 (CDialogBase *)GetParent() 得到父对话框的对象指针。但如果子对话框是非模态的,即在父对话框中调用 Create(IDD_DIALOG_NEW, (CWnd *)this) 和 ShowWindow() 创建的,调用 (CDialogBase *)GetParent() 得到的指针是不正确的,用该指针进行函数调用可以找到函数入口,但在函数中如果访问成员数据将产生一个非法访问异常。(0xXXXXXXX处的内存不能为read)    我又试了在父对话框构造子对话框时调用 m_wndDialogNew.SetParent((CWnd *)this) ,最终结果同上。    请问原因。(如上的问题是我简化了编程模型后抽象出来的)

解决方案 »

  1.   

    1.两个类的头文件是不能相互包含的;2.我一般的解决办法是,在主对话框中定义各个子对话框的成员变量,然后子对话框中要相互访问时,在任何一个对话框中都可以: GetAppDlg()->m_dlgA.xxx
      

  2.   

    不能互相包含可以一个用对象,一个用指针
    比如可以CDialogNew * m_pwndDialogNew;这样的话,#include "DialogNew.h"不用放在DialogBase.h
    放在DialogBase.cpp中就可以
    这样编译就不会错了
    不过要在DialogBase.h中用class CDialogNew声明一下另外,注意把指针传递一下,把cDialogBase对象的指针传递进来
      

  3.   

    2.我的解决方法是:交换数据时,可以把数据放在app里
      

  4.   

    1.两个类的头文件是不能相互包含的;
    在DialogBase.h里面可以用#include "DialogNew.h"
    而在DialogNew.h里则应该用Class CDialogBase;2.最简单的方法就是在两个类里面互建一个对方的指针变量咯。
      

  5.   

    一个非模态对话框(子窗口),如何在在子窗口类的成员函数中访问父窗口类中的数据成员
    class CStatisticsDlg;                   // ***************  声明
    class CValidateDlg : public CDialog
    {
    public:
             CStatisticsDlg *m_pParentDlg;    // ***************  定义
    protected:
    afx_msg void OnButtonStartValidate();
    ...
    }
    DoModal()前,xxx.m_ParentDlg = this;
    ............
      

  6.   

    朋友啊,GetAppDlg()是啥子函数,msdn里没有呀。