2013-04-06 17:12:18 標籤: 初學者 類 C++類前向聲明 類相互包含 原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本聲明。否則將追究法律責任。 http://liam2199.blog.51cto.com/2879872/1172175
http://liam2199.blog.51cto.com/2879872/1172175原文連結
假設聲明兩個類A和B,如果需要在A.h中定義B類對象,B b_; 勢必要包含# include "B.h",而B類中需要定義A類對象A a_; 也要包含B.h,但是相互包含是不允許的,稱為環形引用,這時候就用到了前向聲明。
在B類中進行前向聲明:
class A;
B.h中就不用包含A.h,但是前提是,不能定義對象,只能定義指標或引用。
A類
//A.h # ifndef _A_H_ # define _A_H_ # include "B.h" class A { A(void); ~A(void); B b_; //要包含B.h }; # endif //_A_H
B.h
//B.h # ifndef _B_H_ # define _B_H_ //前向聲明,不能執行個體化對象 class A; // 就不需要包含A.h,要求不能定義對象,只能給定義指標和引用 //因為我們不知道類長聲明樣子,就無法為其分配記憶體 class B { B(void); ~B(void); void fun(A& a)//只能是指標或引用 { ; } //前向聲明的類不能執行個體化對象 A* a_; // }; # endif //_B_H_
B.cpp
B.cpp # include "B.h" # include "A.h" B::B(void) { } B::~B() { }
總結:
前向聲明的類不能執行個體化對象。
前向聲明的定義:有些時候我們可以聲明一些類但是並不去定義它,當然這個類的作用也很有限了。
比如class foo;
聲明一個foo類,這個聲明,有時候也叫做前向聲明(forward declaration),在聲明完這個foo類之後,定義完這個foo類之前的時期,foo類是一個不完全的類型(incomplete type),也就是說foo類是一個類型,但是這個類型的一些性質(比如包含哪些成員,具有哪些操作)都不知道。
因此這個類的作用也很有限.
(1)不能定義foo類的對象。
(2)可以用於定義指向這個類型的指標或引用。(很有價值的東西)
(3)用於聲明(不是定義)使用該類型作為形參或者傳回型別的函數。
正因為有前向聲明的存在,我們在很多時候可以簡便的做一些事情。
在c++中,如果要為類編寫標頭檔的話,一般是要#include一堆標頭檔的,但利用前向聲明和c++編譯器的特性,其中大部分是不需要的。
c++編譯器做的事情主要是:1.掃描符號;2.確定對象大小。
所以很多時候並不需要將類都include進來。
比如:
(1)由於所有物件類型的應用所佔用的空間都是相同大的,所以c++編譯器很好確認對象大小。
class string;
class Sample
{
private:
string &s;
};