【C++】前向引用申明
来源:互联网 发布:唐嫣直播软件 编辑:程序博客网 时间:2024/05/21 17:04
C++中类应当先定义然后才能够使用,但是有时候,两个类存在相互引用的情况,这样无论把哪个类放在前面都不行,这种便叫做循环依赖。
例如
class A{public:void f(B b);};class B{public:void g(A a);};
这里类A的公有成员函数f的形式参数是类B的对象,同时类B的公有成员函数g也以类A的对象为形参。在使用一个类之前,必须首先定义该类,因此无论将哪个类放在前面,都会引起编译错误。解决这种问题的办法就是向前引用声明,在引用未定义的类之前,将该类的名字告诉编译器,使编译器知道那是一个类名。这样,当程序中使用这个类名时,编译器就不会认为是错误,而类的完整定义可以在程序的其他地方。
class B; //向前引用声明class A{public:void f(B b);};class B{public:void g(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.ya(); //错误:Fred类的对象在定义之前被使用}private:Fred &x; //此处是正确的,前向引用声明不可以定义类的对象,但是可以声明Fred类的对象引用或指针};class Fred{public:void ya();private:Barney &y;};
如果想使用method函数,那么我们可以将它改为非内联函数,不过要在Fred完整定以后再给出函数定义。
经过上面一些举证,你对前向引用声明有了一定了解吧,这种方法主要用来处理两个类之间互相依赖的时候一些注意点。
注:上面内容摘抄自《C++程序设计第四版》清华大学出版社
- 【C++】前向引用申明
- 前向引用声明
- 前向引用声明
- 前向引用声明
- 结构体前向申明的小细节
- 规则一 头文件依赖于前向申明
- C++前向引用实例
- C++前向引用声明
- c++-前向声明
- c++ 前向引用详细解说
- 关于前向引用的问题
- 转:使用类别创建前向引用
- 何时要使用前向引用@class
- iOS开发类别的前向引用
- 私有方法的前向引用
- java基础---非法前向引用
- C(最短路_spfa+前向星)
- C++---前向声明应用注意
- oracle 定时执行存储过程
- Sql Server取汉字拼音首字母和汉字首笔划
- 单链表判环判交问题
- proxool 连接池 配置笔记
- Ogre学习笔记(三)OgreMFC 单文档分割窗口
- 【C++】前向引用申明
- 五年网虫之简要回顾
- C#简单的登陆界面!
- AOP注解配置
- 谷歌推翻乔布斯论断:7英寸平板并非毫无价值
- 黑马程序员--HTML基础之Form表单
- TRACE宏 ASSERT宏 VERIFY 宏
- Visual Studio 2010下配置opencv2.3.1
- C语言宏定义方法总结