zoukankan      html  css  js  c++  java
  • 前置声明减少编译时头文件引用

    利用前向声明减少编译时头文件的引入
     
    问题引入:
    假设有三个头文件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...
    如果在头文件中不是声明的指针,而是对象,那么前置声明不可用,一般用指针或者智能指针。
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    《代码大全》阅读心得一
    vi列模式
    以指定的概率/机会获取元素
    自用VIM配置
    优雅的Javascript
    关于遮罩层
    CSS3属性BorderRadius详解[圆角]
    CSS3属性boxshadow详解[盒子阴影]
    CSS3文字特效
    Css3 Animation详解
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/14488165.html
Copyright © 2011-2022 走看看