![]() |
|
||||||||
경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지 |
|
강재호.만해 [greenuri]
2010-03-14 00:36 X
장성호님 2010에서 테스트 중인데요 안나는데요 ^^
저도 BCB6에서 테스트 했습니다. 역시 같은 에러가 나오는군요.
TForm의 상위 클래스인 TCustomForm을 찾아가 보니 생성자가 다음과 같이 되어 있었습니다. /* TCustomForm.Create */ inline __fastcall virtual TForm(Classes::TComponent* AOwner) : TCustomForm(AOwner) { } /* TCustomForm.CreateNew */ inline __fastcall virtual TForm(Classes::TComponent* AOwner, int Dummy) : TCustomForm(AOwner, Dummy) { } 두번째 생성자가 문제의 에러를 일으키는 생성자 입니다. 델파이에서 같은 방식으로 찾아들어가서 생성자를 비교해 보니 constructor Create(AOwner: TComponent); override; constructor CreateNew(AOwner: TComponent; Dummy: Integer = 0); virtual; 위와같이 2개의 생성자가 있네요. 소스를 보니 첫번째 생성자(Create)호출시 두번째 생성자를 호출하도록 되어 있고. 두번째 생성자 호출시엔 첫번째 생성자를 호출하게 되어 있습니다. 첫번째 생성자는 폼(dfm)파일의 정보를 참조해서 폼을 생성하고, 두번째 생성자는 폼파일 정보 없이 디폴트값으로 초기화만 하도록 되어 있군요. 델파이에서도 BCB처럼 두번째 생성자를 오버라이드 해봤는데 이걸 컴파일러에서 막더군요. [Error] Unit1.pas(26): Unsatisfied forward or external declaration: 'TForm1.CreateNew' BCB에서는 두번째 생성자를 오버라이드 해 놓을경우 첫번째 생성자를 호출하면서 스택오버플로우 에러가 나더군요. 첫번째 생성자가 재귀호출되는것으로 보입니다. 여기까지가 제가 알아낸 전부 입니다만... 왜 스택오버플로우 에러가 나는지 모르겠네요. ㅠㅠ 와우~!
정답입니다. TCustomForm.CreateNew 때문에 발생하는 것입니다. TCustomForm.CreateNew 파라메터가 TComponnet * , int 이죠 TForm을 상속받은 폼에서 생성자를 다형성할때 파라메터가 (TComponent * , int ) 인 것이 있으면 TCustomForm의 CreateNew 생성자를 오버라이드 한결과를 낳게되는것입니다. 다음과 같은 TForm2생성자가 있다고 합니다. __fastcall TForm2(TComponent* Owner,int iNumber) : TForm(Owner) //<<== 이부분 { // } TForm2생성자에서 TForm(Owner)를 호출합니다. 이때 TCustomForm.Create(Onwer)를 호출되고 TCustomForm의 생성자 TCustomForm.Create에서 TCustomForm.CreateNew를 호출하는데.. 이때 TCustomForm.CreateNew가 호출되는것이 아니라 TForm2에 override된 생성자가 호출되는것입니다. TForm2에서는 다시 TForm(Owner)를 통해 TCustomForm.Create를 호출하니.. 계속 뺑뺑이 돌면서 stack-overflow가 발생하게 되는것입니다. Form2를 생성할때 다형성한 생성자를 호출하지 않더라도 위와같은 생성자가 있기만 하면 stack-overflow 가 발생하게 됩니다. ----------------------------------------------------------------------- Frigate님 글에 TCustomForm.CreateNew 생성자가 어떤 목적으로 쓰이는지 설명해 두셨는데.. 위 생성자를 이용하면 *.dfm 파일없이 코딩만등로 TForm 또는 TCustomForm을 상속받은 Form 클래스를 만들어 생성할수 있습니다. 아래 링크에... http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=736 그럼.. 관련 글 리스트
|
Copyright © 1999-2015, borlandforum.com. All right reserved. |