C++前置声明

C++前置声明

ID:41478007

大小:29.37 KB

页数:11页

时间:2019-08-25

C++前置声明_第1页
C++前置声明_第2页
C++前置声明_第3页
C++前置声明_第4页
C++前置声明_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。