센트리 객체는 패턴이지만, 아래에 어떤 것이 있는지 (아마도 모든 것) 확실하지 않습니다.
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 */
}
};
이 질문 이외에는 일반 C++ 질문을 할 때 Visual Studio 관련 태그로 질문을 태그하지 마십시오. –
@Pavel 검색을했지만 찾지 못했습니다 –
@Pavel 죄송합니다. 내 첫 번째 질문입니다. –