标签:告诉 外部 组合 span ada 应该 方式 str pre
我们知道C++的类应当是先定义,然后使用。但在处理相对复杂的问题、考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖。
例如:
class A { public: void f(B b);//以B类对象b为形参的成员函数 //这里编译错位,因为‘B‘为为止符号 }; class B { public: void g(A a); };
这里类A的公有成员函数f的形参是类B的对象,同时类B的公有成员函数g也以类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的前向引用声明只能说明Fred是一个类名,而不能给出该类的完整定义,因此在类Barney中不能定义类Fred的数据成员。
再看下面这一段程序:
class Fred; //前向引用声明 class Barney { public: void method() { x->yabbaDabbaDo(); //错误:Fred类的对象在定义之前被使用 } private: Fred* x; //正确,经过前向引用声明,可以声明Fred类的对象指针 }; class Fred { public: void yabbaDabbaDo(); private: Barney* y; };
出错原因:类Barney的内联函数中使用了由x所指向、Fred类的对象,而此时Fred类尚未完整地定义。
应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。
标签:告诉 外部 组合 span ada 应该 方式 str pre
原文地址:https://www.cnblogs.com/wkfvawl/p/10801725.html