C++前置声明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前置声明的使用

有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:

[cpp]view plaincopy

1.// 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.}

16.

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

33.#include "B.h"

34.B::B(void)

35.{

36.}

37.

38.

39.B::~B(void)

40.{

41.}

好的,完成,编译一下A.cpp,不通过。再编译B.cpp,还是不通过。编译器都被搞晕了,编译器去编译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): error C2146: syntax error : missing ';' before identifier 'b'

1>d:/vs2010/test/test/a.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

1>d:/vs2010/test/test/a.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

那怎么办?有办法,C++为我们提供了前置声明。前置声明是什么?举个形象点的例子,就是我要盖一个屋子(CHOuse),光有屋子还不行啊,我还得有床(CBed)。但是屋子还没盖好,总不能先买床吧,床的大小我定了,改天买。先得把房子盖好,盖房子的时候我先给床留个位置,等房子盖好了,我再决定买什么样的床。前置声明就是我在声明一个类(CHouse)的时候,用到了另外一个类的定义(CBed),但是CBed还没有定义呢,而且我还先不需要CBed的定义,只要知道CBed是一个类就够了。那好,我就先声明类CBed,告诉编译器CBed是一个类(不用包含CBed的头文件):

[cpp]view plaincopy

1.class CBed;

然后在CHouse中用到CBed的,都用CBed的指针类型代(因为指针类型固定大小的,但是CBed的大小只用知道了CBed定义才能确定)。等到要实现CHouse定义的时候,就必须要知道CBed的定义了,那是再包好CBed的头文件就行了。

前置声明有时候很有用,比如说两个类相互依赖的时候要。还有前置声明可以减少头文件的包含层次,减少出错可能。上面说的例子。

[c-sharp]view plaincopy

1.// House.h

2.class CBed; // 盖房子时:现在先不买,肯定要买床的

3.class CHouse

4.{

5. CBed* bed; // 我先给床留个位置

6.public:

7. CHouse(void);

8.virtual ~CHouse(void);

9.void GoToBed();

10.};

11.

12.// House.cpp

13.#include "Bed.h"

14.#include "House.h" // 等房子开始装修了,要买床了

15.

16.CHouse::CHouse(void)

17.{

18. bed = new CBed(); // 把床放进房子

19.}

20.

21.CHouse::~CHouse(void)

22.{

23.}

24.

25.void CHouse::GoToBed()

26.{

27. bed->Sleep();

28.}

29.

30.// Bed.h

31.class CBed

32.{

33.

34.public:

35. CBed(void);

36. ~CBed(void);

37.void Sleep();

38.};

39.

40.// Bed.cpp

41.#include "Bed.h"

42.

43.CBed::CBed(void)

44.{

45.}

46.

47.

48.CBed::~CBed(void)

49.{

50.}

相关文档
最新文档