程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> 句柄類的應用中減少重復編譯的方法

句柄類的應用中減少重復編譯的方法

編輯:關於C

 

我們知道,當一個源文件所依賴的頭文件被修改時,這個源文件需要被重新編譯(易碎的基類問題),為了能講述我將說明的這個方法,我們先來看看一個簡單的例子,其代碼如下:

view plain

//head.h 

struct A 

{ int i;}; 

 

class B 

    A* a; 

public: 

    B(int n = 0); 

    void show(); 

    ~B(); 

}; 

 

//head.cpp 

#include "head.h" 

#include <iostream.h> 

B::B(int n) 

    a = new A; 

    a->i = n; 

void B::show() 

    cout << a->i; 

B::~B() 

    delete a; 

 

//main.cpp 

#include <iostream> 

#include "head.h" 

using namespace std; 

int main() 

    B b(1); 

    b.show(); 

    return 1; 

如果我們要修改結構體A,比如我們需要對A添加一個成員變量,這時候head.h改變了,從而包含了它的head.cpp和main.cpp都需要重新編譯

我們知道類B是一個包裝了類A的句柄類,對於這種形式,如何修改代碼使得修改A的定義時能減少重新編譯呢?

觀察head.h,我們發現在B的申明過程中並不需要完全定義類A,利用這點我們可以稍微修改下代碼,修改後的代碼如下:

 

//head.h 

class B 

    struct A;//不完整的類類型說明 

    A* a; 

public: 

    B(int n = 0); 

    void show(); 

    ~B(); 

}; 

 

//head.cpp 

#include "head.h" 

#include <iostream.h> 

struct B::A //A的完全定義 

    int i; 

}; 

B::B(int n) 

    a = new A; 

    a->i = n; 

void B::show() 

    cout << a->i; 

B::~B() 

    delete a; 

 

//main.cpp 

#include <iostream> 

#include "head.h" 

using namespace std; 

int main() 

    B b(1); 

    b.show(); 

    return 1; 

這樣修改後,如果我們需要修改A的定義,我們只需要修改head.cpp,從而可以避免main.cpp需要重新定義

 

總結:如果我們的系統中存在有句柄類,並且系統非常大,則我們可能需要這種所謂的奇技淫巧來避免編譯時間過多

作者 yucan1001

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved