有关C++的问题~~请教

来源:百度知道 编辑:UC知道 时间:2024/06/22 20:32:39
首先看下边的:
在 dlg1 中打开 dlg2 时,dlg2 能修改 dlg1 中的成员变量

//dlg1.cpp
#include "dlg2.h"
CDlg1::OnButton1()
{
CDlg2 dlg2;
dlg2.m_pDlg1 = this;
dlg2.DoModal();
}

//dlg2.h
class CDlg1;//添加dlg1类的声明
class CDlg2 : public CDialog
{
...
public:
CDlg1 *m_pDlg1;
}

//dlg2.cpp
#include "dlg1.h"

至此,你可以在dlg2.cpp中通过m_pDlg1操作CDlg1类中的成员变量了。

这段代码我试验了一下,能完成指定的功能,但是有一些疑问:
1.就是在dlg2.h的文件中为何非得加上class CDlg1;??我把这句去掉就会错,我的想法是dlg2已经包含了1的头文件,那么在定义dlg2时,其中又定义了dlg1的指针,那么在定义1的指针时,程序不会自己通过1的头文件找到1中对dlg1这个类的定义吗?那么这样为何还要在class CDlg1?
2.我若是将在CDlg1::OnButton1()中申明CDlg2 dlg2;的语句,放在CDlg1的类的定义处申明的话,比如放在他的public下,那么就会报错?为啥?
我知道用new的放法,所以不要再说这个了,就说一下为何放在那里会出错就行了。

谢谢了

1、就是在dlg2.h的文件中为何非得加上class CDlg1;??
当然需要,在dlg2中也要加上对dlg1的引用,用class CDlg1是为避免循环重复引用。
2、道理同上。

看下面的详细解释:
一、类嵌套的疑问

C++头文件重复包含实在是一个令人头痛的问题,前一段时间在做一个简单的数据结构演示程序的时候,不只一次的遇到这种问题。假设我们有两个类A和B,分别定义在各自的有文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:
class B;

class A
{
public:
B b;
};

class B
{
public:
A a;
};
因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的。在这里我们只需要把其中的一个A类中的B类型成员改成指针形式就可以避免这个无限延伸的怪圈了。为什么要更改A而不是B?因为就算你在B中做了类似的动作,也仍然会编译错误,表面上这仅仅上一个先后顺序的问题。
为什么会这样呢?因为C++编译器自上而下编译源文件的时候,对每一个数据的定义,总是需要知道定义的数据的类型的大小。在预先声明语句class B;之后,编译器已经知道B是一个类,但是其中的数据却是未知的,因此B类型的大小也不知道。这样就造成了编译失败,VC++6.0下会得到如下编译错误:
error C2079: ‘b’ uses undefined class ‘B’
将A中的b更改为B指针类型之后,由于在特定的平台上,指针所占的空间是一定的(在Win32平台上是4字节),这样可以通过编译。

二、不同头文件中的类的嵌套

在实际编程中,不同的类一般是放在不同的相互独立的头文件中的,这样两个类在相互引用时又会有不一样的问题。重复编译是问题出现的根本原因。为了保证头文件仅被编译一次,在C++中常用的办法是使用条件编译命令。在头文件中我们常常会看到以下语句段(以VC++6.0自动生成的头文件为例):