利用前向声明减少编译时头文件的引入
问题引入:
假设有三个头文件A,B,C,A中起初有一个类且有一个内联函数。
比如:
class XTask1
{
public:
void test1(){}
};
在B中有:
#include "A.h"
class XTask2
{
public:
XTask1 * ptr=nullptr;
void test2();
void test3(){}
};
B中对应的源文件:
#include "B.h"
void XTask2::test2()
{
ptr->test1();
}
在C中有:
include "B.h"
class XTask3
{
public:
XTask2 * ptr=nullptr;
void test4();
};
C对应的源文件:
void XTask3::test4()
{
ptr->test3();
}
当A变动时,B,C每次都会重新编译。
对于B而言,由于用到了A,但是对于C来说则显得多余。
解决方法就是使用前置声明的形式。
如下:
XTask1.h:
#pragma once
class XTask1
{
public:
void Test()
{
}
void Test1()
{
}
void Test3()
{
}
};
XTask1.cpp:
#include "xtask1.h"
XTask2.h:
#pragma once
#include <memory>
//#include "xtask1.h"
//前置声明
class XTask1;
class XTask2
{
void Test();
private:
XTask1* t1 = nullptr;
//XTask1 t1; 用智能指针替代
// std::shared_ptr<XTask1> pt1;
};
XTask2.cpp:
#include "xtask2.h"
#include "xtask1.h"
void XTask2::Test()
{
if (t1)
{
t1->Test();
}
}
XTask3.h:
#pragma once
#include "xtask2.h"
class XTask3
{
public:
XTask2 *t2 = nullptr;
};
XTask3.cpp:
#include "xtask3.h"
说明:
如果把前置声明改为include...,那么当XTask1.h改动时,三个文件都要重新编译。
如果对于XTask3而言,只需要用到XTask2的函数,也就是只调用类XTask的接口函数,那么改变XTask1.h的内容,重新编译XTask3是浪费时间。
在头文件中如果用到类的指针,那么前置声明即可,在cpp文件中,如果要用到,在进行相应的包含,也就是在cpp源文件中用include...
如果在头文件中不是声明的指针,而是对象,那么前置声明不可用,一般用指针或者智能指针。