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

C++빌더 Q&A
C++Builder Programming Q&A
[5570] Re:[질문] dynamic_case를 쓸 경우와 아닐 경우의 차이
박지훈.임프 [cbuilder] 2739 읽음    2001-02-20 04:07
최성규 님이 쓰신 글 :
: 이 동네 Tip'N Tricks 에 있는 "동적 생성된 컴퍼넌트를 TList에서 삭제"에
: 있는 내용을 보고 생각난 것인데요.
: TList object에 어떤 type의 instance들을 만들어 쓰는 아래의 예는
: Tip'N Tricks 14번에 있던 것입니다.
:
: TList *MyButtonList = new TList;
: for(int i=0; i<100; i++)
: {
:     TButton *TempButton = new TButton(this);
:     TempButton->Parent = this;
:     MyButtonList->Add(TempButton);
: }
: 이 경우 컴퍼넌트 삭제는 다음과 같이 해야 합니다.
: while(MyButtonList->Count)
: {
:     delete dynamic_cast<TButton *>(MyButtonList->Items[0]);
:     MyButtonList->Delete(0);
: }
:
: 그,런,데,
: dynamic_case operator를 쓰지 않고 그냥 포인터타입을 casting하면 안될까요?
:
:     delete (TButton *)(MyButtonList->Items[0]);
:
: 컴파일 해 본 결과로는 전통적인 casting을 한 아래의 경우에는 제대로 되는데
: 오히려 dynamic_cast 연산자를 쓴 경우에는 컴파일 에러가 발생하는군요.
:
: [BC++4, Error] E2307 Type 'void' is not a defined class with virtual functions.
: →A dynamic_cast was used with a pointer to a class type that is either undefined,
:   or doesn't have any virtual member functions.
:
: 어케된 것인지...
:
: 청담동에서
: 최성규
:


임펠리테리입니다.

죄송합니다만, 제 팁의 버그입니다. 제가 팁을 쓸 당시에 TList와 TStringList의 Object를 혼동했었던 것 같습니다. TList의 아이템은 void *이므로 타입 정보를 가지지 않아 dynamic_cast가 불가능합니다. 그러므로 TList의 아이템으로 집어넣은 포인터의 경우 반드시 dynamic_cast가 아닌 일반 캐스팅으로 삭제해야만 합니다.

다른 분들의 혼란을 막기 위해 14번 팁은 바로 수정해놓도록 하겠습니다. 알려주셔서 감사합니다.
그럼 이만...

+ -

관련 글 리스트
5530 [질문] dynamic_case를 쓸 경우와 아닐 경우의 차이 최성규 2638 2001/02/17
5570     Re:[질문] dynamic_case를 쓸 경우와 아닐 경우의 차이 박지훈.임프 2739 2001/02/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.