條款15 在資源管理類中提供對原始資源的訪問

2021-09-23 23:33:43 字數 1317 閱讀 9168

對於資源管理類而言,有時候你需要處理原始資源(raw resources)的訪問。當你使用智慧型指標如auto_ptr或tr1::shared_ptr儲存資源類的時候。當你需要訪問智慧型指標指向的原始資源的時候,你有顯示轉換和隱式轉換兩個方法:顯示使用智慧型指標的get函式,隱式方法智慧型指標過載了指標的取值操作符(operator->和operator*)。

有時候必須取得raii物件內的原始資源,某些raii class設計者做法是提供隱式轉換函式,考慮如下的用於字型的raii class(對c api而言字型是一種原生資料資料結構):

fonthandle getfont(); //c api

void releasefont(fonthandle fh); //c api

class font

~font()

private:

fonthandle f;

};

假設有大量與字型相關的c api,它們處理fonthandle,那麼將font轉換成fonthandle會是一種很頻繁的需求,font可能會提供顯示轉換:

class font

; //顯示轉換

...

}//這種情況下用於使用api必須呼叫get:

void changefontsize(fonthandle f,int newsize);

font f(getfont());

int newfontsize;

...changefontsize(f.get(),newfontsize); //顯示將font轉換fonthandle

某些程式設計師認為這樣要求顯示轉換麻煩,不願意使用這樣的class,從而增加洩露字型的可能。

另一種令font提供隱式轉換成fonthandle:

class font

//隱式轉換

...

}font f(getfont());

int newfontsize;

...changefontsize(f,newfontsize); //隱式將font轉換fonthandle

//隱式轉換會增加錯誤的機會:

font f1(getfont());

fonthandle f2 = f1; //原來拷貝乙個font物件,現在卻將底部的fonthandle

//複製給它

上述程式當f1被銷毀時,f2就會非常危險。

是否提供乙個顯示轉換還是提供隱式轉換主要取決於raii class被設計執行的特定工作,以及它被使用的情況。最佳的設計就是要遵守"讓介面被正確使用,不易被誤用"。

條款 15 在資源管理類中提供對原始資源的訪問

使用資源管理類來管理資源,使得我們不必直接處理資源,而交由類來管理,這很好。但是,有些api需要直接訪問資源,你不能給它傳遞乙個這樣的資源管理類物件。這就使得我們的資源管理類能夠解開類的封裝,能夠做到直接訪問資源。需要乙個成員函式,將raii class物件轉換為其所內含的原始資源,可以通過兩種途徑...

條款15在資源管理類中提供對原始資源的訪問

從條款13建立乙個智慧型指標 std shared ptr pinv creatinvestment 假設你希望某個函式處理investment物件 int daysheld const investment pi 然後想要這麼呼叫int days daysheld pinv 但是通不過編譯,因為d...

條款15 在資源管理類中提供對原始資源的訪問

即使我們對一些資源使用了raii類進行管理,但是還是不能避免很多的api需要你去提供原始的資源來對他們進行呼叫 例如對於條款13中的例子來說 1 shardptrpinv createinvestment 2 看看下面這個函式 3int dayshold const investment pi 這裡...