欢迎来到天天文库
浏览记录
ID:41478007
大小:29.37 KB
页数:11页
时间:2019-08-25
《C++前置声明》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、前置声明的使用 有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:[cpp] viewplaincopy1.// A.h 2.#include "B.h" 3.class A 4.{ 5. B b; 6.public: 7. A(void); 8. virtual ~A(void); 9.}; 10. 11.//A.cpp 12.#include "A.h" 13.A::A(void) 14.{ 15.} 1
2、6. 17. 18.A::~A(void) 19.{ 20.} 21. 22.// B.h 23.#include "A.h" 24.class B 25.{ 26. A a; 27.public: 28. B(void); 29. ~B(void); 30.}; 31. 32.// B.cpp 1.#include "B.h" 2.B::B(void) 3.{ 4.} 5. 6. 7.B::~B(void) 8.{ 9.} 好的,完成,编译一下A.cpp,不通过。再编译B.cpp,还是不通过。编译器都
3、被搞晕了,编译器去编译A.h,发现包含了B.h,就去编译B.h。编译B.h的时候发现包含了A.h,但是A.h已经编译过了(其实没有编译完成,可能编译器做了记录,A.h已经被编译了,这样可以避免陷入死循环。编译出错总比死循环强点),就没有再次编译A.h就继续编译。后面发现用到了A的定义,这下好了,A的定义并没有编译完成,所以找不到A的定义,就编译出错了。提示信息如下:1>d:/vs2010/test/test/a.h(5):errorC2146:syntaxerror:missing';'beforeidentifier'b'1>d:/vs2010/test/test/a.h
4、(5):errorC4430:missingtypespecifier-intassumed.Note:C++doesnotsupportdefault-int1>d:/vs2010/test/test/a.h(5):errorC4430:missingtypespecifier-intassumed.Note:C++doesnotsupportdefault-int 那怎么办?有办法,C++为我们提供了前置声明。前置声明是什么?举个形象点的例子,就是我要盖一个屋子(CHOuse),光有屋子还不行啊,我还得有床(CBed)。但是屋子还没盖好,总不能先买床吧,床的大
5、小我定了,改天买。先得把房子盖好,盖房子的时候我先给床留个位置,等房子盖好了,我再决定买什么样的床。前置声明就是我在声明一个类(CHouse)的时候,用到了另外一个类的定义(CBed),但是CBed还没有定义呢,而且我还先不需要CBed的定义,只要知道CBed是一个类就够了。那好,我就先声明类CBed,告诉编译器CBed是一个类(不用包含CBed的头文件):[cpp] viewplaincopy1.class CBed; 然后在CHouse中用到CBed的,都用CBed的指针类型代(因为指针类型固定大小的,但是CBed的大小只用知道了CBed定义才能确定)。等到要实现CH
6、ouse定义的时候,就必须要知道CBed的定义了,那是再包好CBed的头文件就行了。 前置声明有时候很有用,比如说两个类相互依赖的时候要。还有前置声明可以减少头文件的包含层次,减少出错可能。上面说的例子。 [c-sharp] viewplaincopy1.// House.h 2.class CBed; // 盖房子时:现在先不买,肯定要买床的 3.class CHouse 4.{ 5. CBed* bed; // 我先给床留个位置 6.public: 1. CHouse(void); 2. virtual ~CHouse(void
7、); 3. void GoToBed(); 4.}; 5. 6.// House.cpp 7.#include "Bed.h" 8.#include "House.h" // 等房子开始装修了,要买床了 9. 10.CHouse::CHouse(void) 11.{ 12. bed = new CBed(); // 把床放进房子 13.} 14. 15.CHouse::~CHouse(void) 16.{ 17.} 18. 19.void CHouse::GoToBed
此文档下载收益归作者所有