標籤:blog http ar os sp 檔案 on art log
這兩者都是為了降低檔案之間的編譯依存
1編譯依存
class class_name{
member1 m_m1;
member2 m_m2;
public:
member1 get_member_1() const{};
member2 get_member_2() const{];
};
假設上面的標頭檔是file.h,當file1.h發生變化,或者file中的class_name的實現發生變化時,所有包含file。h的檔案都得重新編譯,當file。h被很多檔案包含時,即使只是對class_name做了很小的改動,也要花費大量的編譯時間。
2Handler class
handle class只是提高了所有的介面,同時包含了一個指向真正實作類別的指標,真正的實作類別包含在了另一個檔案中,當藥修改這個類的時候,只有file。h會引起重新編譯,而包含了file。h的其他檔案不會重新編譯
#include"file1.h" //contain member1
#include"file2.h" //contain member2
#include"implement.h"
class class_name
{
class_impl* implement; //一般會用shared pointer
public:
member1 get_member_1()const
{
return implement->get_member_1();
}
member2 get_member_2() const
{
return implement->get_member_2();
}
};
下面是是implement.h的實現
class class_impl
{
member1 m_1;
member2 m_2;
public;
member1 get_member_1()const {}
member2 get_member_2()const {}
};
2、interface class
這是製作handle class的另外一種方法
首先聲明class是抽象基類,一般裡面的介面都是純虛函數,然後提供一個static的create函數,這個函數返回該抽象類別的某個具體的子類的對象,函式宣告中的傳回值仍然是該抽象類別的指標或引用。具體子類在另外一個檔案中聲明。
class Base
{
public:
virtual ~Base() {}
void DoSomething()
{
StepOne();
StepTwo();
}
private:
virtual void StepOne() = 0;
virtual void StepTwo() = 0;
};
class Derived : public Base
{
private:
virtual void StepOne()
{
cout << "Derived StepOne: do something." << endl;
}
virtual void StepTwo()
{
cout << "Derived StepTwo: do something." << endl;
}
};
Handle class && Interface class