2012-07-04 33 views
4

我有一個對象,在其最基本的級別,看起來像這樣:C++常量性爲C包裝

#include <X11/Xlib.h> 

class x_link { 
    public: 
     x_link() 
     { 
      display_ = XOpenDisplay(NULL); 
     } 

     ~x_link() 
     { 
      XCloseDisplay(display_); 
     } 

     Display* display_ptr() const 
     { 
      return display_; 
     } 

    private: 
     Display* display_; 
}; 

我想知道「常量」如何x_link::display_ptr()應該在的情況下喜歡這個。

這個較舊的問題Should member functions be 「const」 if they affect logical state, but not bitwise state?給我的印象是,由於我的方法本身不影響對象的邏輯狀態或按位狀態,所以const是要走的路。

但與此同時,提供Display*允許用戶打破對象(例如,通過自己調用XCloseDisplay()),這將是一個非常非常量的事情。

有什麼想法?

+1

爲什麼你提供訪問私人指針? –

+0

,因爲生命短暫,Xlib巨大。除非我在這個對象中提供了一個我關心的Xlib的所有部分的接口(這是可能的,但它意味着一個大的專用對象),其他代碼將需要訪問該指針。 – tecu

+0

這看起來像一個簡單的RAII風格的使用。任何你爲什麼不用'std :: shared_ptr'(或'boost :: shared_ptr')來定製刪除器的原因?它將幫助你獲得像複製構造函數和賦值工作的東西。 –

回答

1

該類看起來像一個簡單的包裝類,其目的主要是包裝一個C接口。在這種情況下,我建議你根本不要使用const來使程序複雜化。

我保留使用const來清除對象或函數爲只讀的情況。

Const是許多C++特性之一,它常常欺騙程序員使其程序變得不必要的複雜。

+0

謝謝你的提示;我必須記住這一點。 const已經給我足夠的hangups了。 – tecu

+1

當類本身將被用作一個常量實例時,一個實際上只需要使函數爲常量:「const x_link xl;」或「const x_link * xl」。但是擁有該類的const實例的唯一理由是它是否將用於其有意義的狀態無法更改的上下文中。考慮使用可以幫助避免複雜的哲學問題,例如什麼構成改變複雜對象的狀態。 –