C++

C++中两个类相互包含引用问题

Posted by Kerwen Blog on May 31, 2015

在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A  
{  
	
	int i;  
	
	B b;  
}  
  
class B  
{ 
	int i;  
  
	A* a;  
}  

请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A  
{  
	int i;  

	B b;  
  
}  
  
class B    
{  
  
	int i;  
  
	A a;  
}  

在这种情况下,想想可以有a.b.a.b.a.b.a.b.a.b…………,很有点子子孙孙无穷尽之状,那么我的机器也无法承受。最主要的还是这种关系很难存在,也很难管理。这种定义方式类同程序中的死循环。所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

言归正传,那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的,如下:

//class A.h

1
2
3
4
5
6
7
8
9
10
11
#include "B.h"  
  
class A  
  
{  
  
	int i;  
  
	B b;  
  
}  

//class B.h

1
2
3
4
5
6
7
8
#include "A.h"  
  
class B  
  
{  
	int i;  
	A *a;  
}  

如上的包含方式可能会造成编译器有错误提示:A.h文件中使用了示知类型B。
怎么办?
一般的做法是:两个类的头文件之中,选一个包含另一个类的头文件,但另一个头文件中只能采用class ;的申明形式,而在实现文件中(.cpp)中包含头文件,如下:
//class A.h

1
2
3
4
5
6
7
#include "B.h"  

class A  
{  
	int i;  
	B b;  
}  

//class B.h

1
2
3
4
5
6
class A;  
class B  
{  
	int i;  
	A *a;  
}  

//B.cpp
//在B.cpp中的文件包含处要有下面语句,否则不能调用成员a的任何内容

1
2
3
4
5
6
#include "A.h"  

B::B()  
{  
	……  
}  

Post Date: 31 May 2015