特点:被声明的类不用重新编译,节省编译时间
比如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)
{
}