2012-07-04 4 views
4

내가 가장 기본적인 수준에서,이처럼 보이는 물체가 : 내가 x_link::display_ptr()이 경우에 어떻게해야 "CONST"궁금C++ const를-다움

#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_; 
}; 

을 이렇게.

이 이전 질문 인 Should member functions be “const” if they affect logical state, but not bitwise state?은 내 방법이 객체의 논리 또는 비트 상태에 영향을 미치지 않으므로 (const)가는 길이라는 인상을줍니다.

을 제공하지만 동시에 Display*을 제공하면 사용자가 객체를 깨뜨릴 수 있습니다 (예 : XCloseDisplay()). 매우 비 const 일 수 있습니다.

의견이 있으십니까?

+1

왜 개인 포인터에 대한 액세스 권한을 제공합니까? –

+0

은 수명이 짧고 Xlib가 큽니다. 이 객체 내에서 Xlib의 모든 부분에 대한 인터페이스를 제공하지 않는 한 (가능하지만 크고 특수한 객체를 의미 함) 다른 코드는 해당 포인터에 대한 액세스가 필요합니다. – tecu

+0

이것은 간단한 RAII 스타일 사용처럼 보입니다. 'std :: shared_ptr' (또는'boost :: shared_ptr')을 커스텀 Deleter와 함께 사용하지 않는 이유는 무엇입니까? 복사 생성자 및 할당 작업과 같은 것을 얻을 수 있도록 도와줍니다. –

답변

1

이 클래스는 기본적으로 C 인터페이스를 래핑하는 데 사용되는 단순한 래퍼 클래스처럼 보입니다. 이 경우에는 const를 사용하여 프로그램을 복잡하게하지 말 것을 권한다.

개체 또는 함수가 읽기 전용 인 경우 명확한 컷 케이스에 const를 사용합니다.

Const는 종종 프로그래머를 속여 프로그램을 불필요하게 복잡하게 만드는 많은 C++ 기능 중 하나입니다.

+0

팁 주셔서 감사합니다. 나는 그것을 염두에 두어야 할 것이다. const는 확실히 충분한 hangups를 이미 나에게 일으켰습니다. – tecu

+1

클래스 자체가 const 인스턴스로 사용될 때 정말로 함수 const를 만들 필요가 있습니다. "const x_link xl;" 또는 "const x_link * xl". 그러나 클래스의 const 인스턴스를 갖는 유일한 이유는 해당 클래스의 상태를 변경할 수없는 의미있는 문맥에서 사용되는 경우입니다. 사용법을 생각하면 복잡한 대상의 상태를 바꾸는 것과 같은 복잡한 철칙 문제를 피할 수 있습니다. –