2010-04-22 1 views
13

I answeredquestionPotatoswatteranswered 너무C++에서 "보초 개체"란 무엇입니까?()의 생성자 구현 호출, 함수의 시작 부분을 구성하고, :

으로 현대 C++ 동등한은 보초 객체가 될 것입니다 반환 (또는 비정상적인 종료)시, 소멸자 구현

C++에서 센트리 객체 사용에 익숙하지 않습니다. 입력 및 출력 스트림이 제한적이라고 생각했습니다.

누군가 내게 C++ 보초 개체에 대해 설명 할 수있을뿐만 아니라 클래스의 하나 이상의 메서드에 대해 주변 요격기로 사용하는 방법을 설명 할 수 있습니까?

즉이를 수행하는 방법은 무엇입니까?

센트리 개체는 매우 비슷합니다. 참으로. 한편으로 그들은 명시 적 인스턴스화를 필요로 (그리고 이 통과되는)하지만 클래스의하지 단지 불변을 확인하지만, 그래서 다른 한편으로는 당신 그들에 추가 할 수있는 기능 몇 가지 사전/사후 조건 손에.

+1

이 질문 이외에는 일반 C++ 질문을 할 때 Visual Studio 관련 태그로 질문을 태그하지 마십시오. –

+1

@Pavel 검색을했지만 찾지 못했습니다 –

+0

@Pavel 죄송합니다. 내 첫 번째 질문입니다. –

답변

15

센트리 객체는 패턴이지만, 아래에 어떤 것이 있는지 (아마도 모든 것) 확실하지 않습니다.

C++ 프로그램은 객체 (사용자 정의 클래스 일 수 있음)가 파괴 될 때, 즉 소멸자가 호출 될 때 지식에 크게 의존합니다. 가비지 콜렉션이있는 언어의 경우는 그렇지 않습니다.

이 기술은 "Resource Acquisition Is Initialization"패러다임을 포용하는 데 사용됩니다. 개체 생성자가 호출 될 때 리소스를 얻고 컴파일러가 자동으로 소멸자를 호출하여 정상 및 비정상 (예외적) 상황 (체크 this question).당신은 건설/파괴 타이밍의 지식을 활용할 수

일반적인 장소

  • 블록 있습니다 : "스택 할당"개체에 대한 소멸자는 블록의 끝에서 호출

    void function() 
    { Class foo = Object(resource); 
        other_operations(); 
    } // destructor for foo is called here 
    
  • 함수 호출 : 함수를 호출하면 "스택 할당"이 발생합니다.

    포함하는 객체 0
    void function() 
    { another_function (Class(resource) ); 
        // destructor for the unnamed object is called 
        // after another_function() returns (or throws) 
        other_operations(); 
    } 
    
  • 건축/파괴 : STL에서

    class Foo 
    { Class sentry; 
        public: Foo() 
        { // Constructor for sentry is called here 
         something(); 
        }   
        public: ~Foo() 
        { 
         something(); 
        } // destructor for sentry is called here 
    }; 
    

위에서 설명한 세 번째 패턴을 구현한다 (보다 정확하게 istream::sentry) sentry라는 클래스 거기 . 그래서 저는 그것이 일부 프로그래머들이 "보초 개체"라고 부르는 것이라고 생각합니다.

그러나 실제로 상기 클래스 Class의 상기 목적 중 하나는 "보초 개체"라고 부를 수있다. 그들은 "감시병"입니다. 왜냐하면 어떤 것이 예외를 던지더라도 이러한 도비적인 객체 파괴자가 놓치지 않도록하기 때문입니다 (그래서 그들은 블록/클래스의 수호자와 같습니다).

더 많은 보초 개체 예제는 RAII question입니다.


애스펙트 지향 프로그래밍과의 관계를 볼 수 있습니다. 이 객체들은 "aspect"와 같은 것으로서, "둘러싼 블록의 시작/끝", "객체를 포함하는 것의 생성/파괴시"등이 있습니다. 그러나이 "aspect"은 코드 안에이 있어야합니다. 따라서 원래의 call/return 기능에 비해 "aspective"가 적습니다. 대신, 센트리 객체 클래스의 각 기능에 삽입되어야한다

class X{ 
    struct Sentry { 
    Sentry() { /* call() */} 
    ~Sentry() { /* return() */}; 
    }; 

    void member_function() 
    { Sentry(); 
    /* operations */ 
    } 

    void another_member_function() 
    { Sentry(); 
    /* operations */ 
    } 
}; 
+1

시간을 내서 잘 설명해 주셔서 감사합니다. –

+5

@Romian, 아무런 문제가 없습니다. 실제 작업을 미루는 데 최선을 다하고 있습니다. _ < –

+2

우리 모두는 이것을 알지 못합니까? – sbi

2

Here은 변수를 이전 값으로 재설정하는 보초 클래스의 예입니다.

+0

게시물의 질문에 대한 답변을 볼 수 없습니다. 보초 개체가 패턴입니까? –

+0

@Romain : 그렇다면 질문을 잘못 읽었습니다. 나는 당신이 보초 물체가 무엇인지와 그것을 어떻게 사용 하는지를 묻고 있다고 생각했습니다. – sbi

+0

@Romain : 예, 패턴이며 특정 클래스가 아닙니다. 또한, 함수 내에서 파생되지 않은 로컬 클래스를 센트리로 사용할 수도 있습니다. – Potatoswatter

3

AOP와의 차이는 함수 본문 또는 클래스 정의 내 명시 어딘가에 센트리 바꾸어 협동을 수행한다는 것이다.

대상 기능이나 클래스를 수정하지 않고도 전화를 걸 수 없습니다.