1.简单采取前向引用
我们知道C++的类应当是先定义,然后使用。但在处理相对复杂的问题、考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖。
例如:
class A
{
public:
void f(B b);//以B类对象b为形参的成员函数
//这里编译错位,因为'B'为为止符号
};
class B
{
public:
void g(A a);
};
因此 只需要先生成
class B; //前向引用声明
class A//A类的定义
{
public://外部接口
void f(B b);//以B类对象b为形参的成员函数
};
class B//B类的定义
{
public://外部接口
void g(A a);//以A类对象a为形参的成员函数
};
使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。请看下面的程序段:
class Fred; //前向引用声明
class Barney
{
Fred x; //错误:类Fred的声明尚不完善
};
class Fred
{
Barney y;
};
为什么呢?其问题出在:若是在形参列表里定义了类,此时编译的时候是不需要衡量数据大小的,所以只需要提前声明,告诉编译器,有这个类就行了。而第二种Fred x
问题出在定义Barney的时候,必须知道Fred类的所占空间大小,因为它是Barney类的成员。因此必须采用指针对其处理。如下面的方案:
二.通过指针处理
class Fred; //前向引用声明
class Barney
{
private:
Fred* x; //正确,经过前向引用声明,可以声明Fred类的对象指针
};
class Fred
{
private:
Barney y;
};
因为指针的长度是固定的,所以在编译的时候不会发生无法定义内存空间大小的问题。如此一来,就能够在循环依赖的类中定义一个可以用的成员变量了。