前置聲明及可能出現問題

A.h

class A{
public:
	B* m_;
}


這樣會編譯出錯,因爲B沒有定義

#include "B.h"

#include "B.h"

class A{
public:
	B* m_;
}


但是這樣,一旦B的定義修改,那麼A.h也就會重新編譯,導致所有用到A.h的文件也需要重新編譯,這樣就造成了編譯依賴,增加了編譯的時間,在大型項目中,如果很多這樣的地方的話,甚至可能極度增加編譯時間。爲了避免這種情況,我們可以這麼做 用 class B;

A.h


class B;
class A{
public:
	B* m_;
}


A.cpp

#include "B.h"
#include "A.h"
//具體實現


通過在A.h中聲明class B,在A.cpp中include B.h,這樣即使B.h改變,A.h也不會改變,其他使用到A.h的文件也就不需要重新編譯了,這樣就可以避免編譯依賴,

在大型項目中會節省很多時間

參考:

 

https://blog.csdn.net/weixin_42837024/article/details/82349304?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

 

https://blog.csdn.net/qingzhuyuxian/article/details/92157301

 

這個例子比較確切:

// House.h
class CBed; // 蓋房子時:現在先不買,肯定要買牀的
class CHouse
{
    CBed* bed; // 我先給牀留個位置
public:
    CHouse(void);
    virtual ~CHouse(void);
    void GoToBed();
};
 
 
// House.cpp
#include "Bed.h"
#include "House.h" // 等房子開始裝修了,要買牀了
 
CHouse::CHouse(void)
{
    bed = new CBed(); // 把牀放進房子
}
 
CHouse::~CHouse(void)
{
}
 
void CHouse::GoToBed()
{
    bed->Sleep();
}
 
 
// Bed.h
class CBed
{
 
public:
    CBed(void);
    ~CBed(void);
    void Sleep();
};
 
 
// Bed.cpp
#include "Bed.h"
 
CBed::CBed(void)
{
}
 
 
CBed::~CBed(void)
{
}
 
void CBed::Sleep()
{
 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章