天天看點

Effective C++ 在資源管理類中提供對原始資源的通路前言顯式通路隐式轉換

前言

前面提到,我們使用棧對象來管理資源已達到對資源的正确回收,防止資源洩露的目的。有了資源管理類後,我們還需要再類裡面提供對資源的通路方法,不然如果我們無法通過管理類來對資源進行通路,那我們還是會直接繞過管理類去直接通路資源,醬紫是不好的。

一般來說,資源管理類可以提供兩種方式供外界去通路它所管理的資源:顯式通路和隐式轉換。

顯式通路

所謂顯示通路就是在管理類的内部提供某個函數,使得外界可以得到資源的指針。通過這個函數被命名為get()函數,當然為了友善,我們也可以重載*,->運算符。

假設有一類資源FontHandle 字型處理類:

FontHandle getHandle();得到字型資源
void releaseFont(FontHandle fh);釋放字型資源
           

有一個資源管理類:

class Font
{
public:
Font(FontHandle fh):f(fh)
{
}
~Font()
{
releaseFont(f);
}
private:
FontHandle f;
};
           

我們加上get()函數:

class Font
{
public:
Font(FontHandle fh):f(fh)
{
}
~Font()
{
releaseFont(f);
}
FontHandle get() const
{
    Return f;
}
private:
FontHandle f;
};
           

這樣就可以通路裡面的原始資源了。

隐式轉換

假設資源管理類已經提供了顯示通路的API,那麼使用者每次通路底層資源都需要顯示地調用get()函數,這樣既有好處也有不足。好處在于這種轉換都是使用者知曉的,由使用者控制的,不會發生一些使用者不願意轉換卻轉換的事情。不足在于,如果這類顯示通路太于頻繁将很影響管理類的便利性。

于是隐式轉換就出現了,隐式轉換提供一種自動将資源管理對象轉換為原始資源指針的功能。這主要是通過重載 類型轉換運算符實作的。

例如:

class Font
{
public:
Font(FontHandle fh):f(fh)
{
}
~Font()
{
releaseFont(f);
}
FontHandle get() const
{
    Return f;
}
operator FontHandle() const
{
    Return f;
}
private:
FontHandle f;
};
           

這樣在所有可以以FontHandle為參數的地方都可以填入Font對象了。

繼續閱讀