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) ,最终结果同上。 请问原因。(如上的问题是我简化了编程模型后抽象出来的)
发生错误时的情景: 创建一个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) ,最终结果同上。 请问原因。(如上的问题是我简化了编程模型后抽象出来的)
比如可以CDialogNew * m_pwndDialogNew;这样的话,#include "DialogNew.h"不用放在DialogBase.h
放在DialogBase.cpp中就可以
这样编译就不会错了
不过要在DialogBase.h中用class CDialogNew声明一下另外,注意把指针传递一下,把cDialogBase对象的指针传递进来
在DialogBase.h里面可以用#include "DialogNew.h"
而在DialogNew.h里则应该用Class CDialogBase;2.最简单的方法就是在两个类里面互建一个对方的指针变量咯。
class CStatisticsDlg; // *************** 声明
class CValidateDlg : public CDialog
{
public:
CStatisticsDlg *m_pParentDlg; // *************** 定义
protected:
afx_msg void OnButtonStartValidate();
...
}
DoModal()前,xxx.m_ParentDlg = this;
............