天天看點

C++ 前置聲明

特點:被聲明的類不用重新編譯,節省編譯時間

比如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)
{

}