임펠리테리입니다.
방금 비파툴에서 답변하고 오는 길인데.. 이점은 의외로 실수하기 쉽겠다 싶어서,
오늘의 팁으로 올립니다.
동적으로 컴퍼넌트를 생성할때, 그 갯수를 정확히 예측할 수 없거나 아주 많을 경우
TList에다 그 컴퍼넌트의 포인터를 저장합니눼? 아주 많이 쓰이는 코딩이죠.
그리고 삭제할때는? 리스트 객체의 Delete 메소드를 쓰면 그 컴퍼넌트가 삭제될까요?
정답은... "안된다" 입니다. 보통은 된다고 착각하기 쉽겠죠.
하지만, 논리적으로 가만히 생각해보면 이게 사실이 아님을 금방 알수 있습니다.
컴퍼넌트를 삭제하려면 그 컴퍼넌트의 destructor를 호출해야 합니다.
그리고 destructor를 호출하려면 당연히 그 destructor가 있는 클래스를 알아야 합니
다. 다시 말해서, type을 모르면 destructor를 호출할 수 없고, 결과적으로 컴퍼넌트
삭제는 불가능합니다.
그런데 TList 객체는 어떤 객체든 void *형으로 저장합니다. 당연히 TList 객체의
Delete 메소드는 컴퍼넌트를 삭제해줄 수 없습니다.
예를 들어서 다음과 같이 버튼들을 동적으로 생성했다고 합시다.
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 (TButton *)(MyButtonList->Items[0]);
MyButtonList->Delete(0);
}
빌더 프로그래밍에 익숙하신 분들도 의외로 실수하시기 쉬운 부분이죠.
그럼 도움되시길 바랍니다...
독립문에서 임펠리테리였습니다.
|