前置声明减少编译时头文件引用

利用前向声明减少编译时头文件的引入
 
问题引入:
假设有三个头文件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...
如果在头文件中不是声明的指针,而是对象,那么前置声明不可用,一般用指针或者智能指针。
 
 
 
 
 
 
 
 
 
 
posted @ 2021-03-05 19:53  sunshine_gzw  阅读(141)  评论(0编辑  收藏  举报