C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[787] AfterConstruction, BeforeDestruction
김태선 [cppbuilder] 6781 읽음    2008-07-28 23:03
TObject에 보면 여러가지 메소드가 있는데 이 중에서
AfterConstruction, BeforeDestruction 라는 2개의 메소드는
각각 생성자가 불려진 직후 실행되고 소멸자가 불려지기 직전에 실행됩니다.

그러닌까 TObject의 자손들은 모두 이 두가지 메소드를 오버라이드해서 클래스 객체의 생성자와 소멸자가
불려진 직후와 불려지기 직전에 어떤 기능을 추가해서 넣을 수 있는 것입니다.
원래의 두개의 메소드는 추적해 보면 아시겠지만 빈탕으로 되어 있습니다. 그냥 나중에 필요하면 쓰라는
개발자의 의도가 있을 뿐 실제로 두가지 procedure 내에서 하는 일은 없는 것이죠.

그러면 간단히 테스트해 보겠습니다.
아래는 많이 쓰이는 TStringList를 상속받아 TStringList로 만들고 여기에 2가지 메소드를 오버라이드해서
정말 정확하게 그때에 불려지는지 테스트해보기 위한 코드를 넣었습니다.
TStringList를 상속받아 TStringList를 만든 이유는 기존에 있는 코드를 수정하기 않고 이 기능만
적용하기 위함입니다. 다시 말해  이는 본래의 코드는 손대지 않고 디버깅 같은 용도로 쓸수 있음을 의미하며
이것 자체가 실전에 유용하게 사용할 수 있는 테크닉입니다.
델파이는 같은 이름의 클래스를 만들수 있으나 C++은 안된다고 흔히 알고 있는데
아래처럼 네임스페이스를 달리하는 기법으로 극복할 수 있습니다.

class TStringList : public Classes::TStringList
{
public:
    virtual void __fastcall AfterConstruction()
    {
        Form1->Memo1->Lines->Add("생성자 실행 직후 임돠.");
    }
    virtual void __fastcall BeforeDestruction()
    {
        Form1->Memo1->Lines->Add("소멸자 실행 직전 임돠.");
    }
};
// 이건 C++컴파일러가 클래스 지정의 모호성(Ambiguity )을 없애기 위해 위에 선언한 클래스를 강제로 쓰도록 하고 있습니다.
#define TStringList            ::TStringList


이 코드를 헤더파일 선두 즈음에 넣어주면 됩니다.

그러면 실제 기존의 코드에 넣어 돌려보면 TStringList가 생성될때와 소멸될때 정확하게 메시지가 출력됩니다.
물론 기존의 기능은 조금도 이상없이 돌아갑니다.

실전에
AfterConstruction, BeforeDestruction 가 얼마나 유용하게 쓰일지는 알수 없습니다.
아마도 메모리 릭을 없애기 위해 점검하는 코드를 넣는 것도 유용할 지 모르겠군요.
하지만 이런 것도 있다는 정도만 인지하고 있어도 나중에 도움이 되는 순간이 오지 않을까요.

그럼.

+ -

관련 글 리스트
787 AfterConstruction, BeforeDestruction 김태선 6781 2008/07/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.