天天看点

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

}