C++ 前置宣告
阿新 • • 發佈:2018-12-04
特點:被宣告的類不用重新編譯,節省編譯時間
比如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() { }
3、
// Symbol.h
// 符號類
#pragma once
#include "Layer.h"
class CSymbol
{
public:
CSymbol(void);
virtual ~CSymbol(void);
public:
CLayer *m_pRelLayer; // 符號對應的相關圖層
};
4、
#include "Symbol.h "
CSymbol::CSymbol(void)
{
}
CSymbol::~CSymbol(void)
{
}
概念參考:
https://blog.csdn.net/liyuanhong13/article/details/9953023