即使我們對一些資源使用了raii類進行管理,但是還是不能避免很多的api需要你去提供原始的資源來對他們進行呼叫:
例如對於條款13中的例子來說:
1 shardptrpinv(createinvestment);2//看看下面這個函式
3int dayshold(const investment * pi);//
這裡我們所需要的就是提供原始的資源
所以說類似shared_ptr這樣的raii類都提供乙個get函式,讓使用者可以自由的取得內部真正的資源(的副本),通過這個get函式上面api的使用可能就變成了下面這樣:
...int ans = dayshold(pinv.get());
如果覺得get可能使用起來非常的的彆扭的話,甚至可以提供乙個operator()來進行隱式的轉換,但是隱式的轉換過程中可能會產生意想不到的錯誤,所以到底是使用隱式的operator()還是get函式就見仁見智了,
ps:這裡可不可以使用explicit operator(),這樣是不是不get函式稍微好一點,而且安全性也較高。
最後一句說了:get可能還是要好一點,良好的class的設計準則是隱藏客戶不需要看的部分,而且又將使用者所有需要的東西都準備妥當,就像這裡的get函式一樣
條款15 在資源管理類中提供對原始資源的訪問
對於資源管理類而言,有時候你需要處理原始資源 raw resources 的訪問。當你使用智慧型指標如auto ptr或tr1 shared ptr儲存資源類的時候。當你需要訪問智慧型指標指向的原始資源的時候,你有顯示轉換和隱式轉換兩個方法 顯示使用智慧型指標的get函式,隱式方法智慧型指標過載了指...
條款 15 在資源管理類中提供對原始資源的訪問
使用資源管理類來管理資源,使得我們不必直接處理資源,而交由類來管理,這很好。但是,有些api需要直接訪問資源,你不能給它傳遞乙個這樣的資源管理類物件。這就使得我們的資源管理類能夠解開類的封裝,能夠做到直接訪問資源。需要乙個成員函式,將raii class物件轉換為其所內含的原始資源,可以通過兩種途徑...
條款15在資源管理類中提供對原始資源的訪問
從條款13建立乙個智慧型指標 std shared ptr pinv creatinvestment 假設你希望某個函式處理investment物件 int daysheld const investment pi 然後想要這麼呼叫int days daysheld pinv 但是通不過編譯,因為d...