|
최성규 님이 쓰신 글 :
: 이 동네 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번 팁은 바로 수정해놓도록 하겠습니다. 알려주셔서 감사합니다.
그럼 이만...
|