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