特點:被聲明的類不用重新編譯,節省編譯時間
比如A包含一個指向B的指針,B包含A的一個執行個體,這種情況下,使用前置聲明。
易錯的點
class Date;
class Task1 {
public:
Date d;
};
因為配置設定器為d配置設定記憶體的時候,必須要知道 d的大小
主要應用場景是兩個頭檔案互相包含的場景,建議僅将前置聲明用于解決循環引用問題。
(頭檔案并不參加連結和編譯。編譯器第一步要做的就是簡單的把頭檔案在包含它的源檔案中展開。不知你是否能了解這句話。也就是頭檔案裡面有什麼内容,通通把它移到包含這個頭檔案的源檔案裡,當無法展開頭檔案,就會出現問題)
下面是示例demo
1、
//Layer.h
// 圖層類
#pragma once
#include <iostream>
//#include "Symbol.h"
class CSymbol;
class CLayer
{
public:
CLayer(void);
virtual ~CLayer(void);
void CreateNewSymbol();
private:
CSymbol* m_pSymbol; // 該圖層相關的符号指針
};
2、
#include"Layer.h"
#include "Symbol.h"
CLayer::CLayer(void)
{
m_pSymbol = NULL;
}
CLayer::~CLayer(void)
{
}
void CLayer::CreateNewSymbol()
{
}
// Symbol.h
// 符号類
#pragma once
#include "Layer.h"
class CSymbol
{
public:
CSymbol(void);
virtual ~CSymbol(void);
public:
CLayer *m_pRelLayer; // 符号對應的相關圖層
};
#include "Symbol.h "
CSymbol::CSymbol(void)
{
}
CSymbol::~CSymbol(void)
{
}