BCB的一个Bug?

ylm163net 2001-08-22 07:59:40
我怀疑这是一个Bug,具体情况如下:
1、创建两个窗体 Form1,Form2 并在Option中设Form2为窗体变量
2、在Unit2.h中增加构造函数
__fastcall TForm2(TComponent *Owner,int a):TForm(Owner){}
3、在Form1的窗体上增加一个按钮,在其OnClick事件中写如下代码
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TForm2 *Form=new TForm(this);
Form->ShowModal();
delete Form;
}

4、执行程序,点击按钮,程序报告堆栈溢出

经跟踪,发现__fastcall TForm2(TComponent *Owner,int a):TForm(Owner){}
被持续调用,耗尽堆栈空间,但如果按下述方式定义,却无问题:
__fastcall TForm2(int a,TComponent *Owner):TForm(Owner){}


请各位指点,到底是怎么回事,Bug还是定义有问题

另,这几天暂时无法正常上网,我对本贴的回复可能不太及时,希望大家能够原谅
...全文
181 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylm163net 2001-11-05
  • 打赏
  • 举报
回复
先结账再说
lyghe 2001-10-22
  • 打赏
  • 举报
回复
第二个构造函数写成这样(注意最后面):
__fastcall TForm2::TForm2(TComponent* Owner, int a) : TForm(Owner, a)
可惜的是:当调用这个构造函数创建新窗口时,只能得到一个空窗口,而不是期望中的那个。

原先的构造函数调用可能是这样的:
TForm2(TComponent)->TForm(TComponent)->TForm2(TComponent,int)->TForm(TComponent)->……
现在的是:
TForm2(TComponent)->TForm(TComponent)->TForm2(TComponent,int)->TForm(TComponent,int) 结束

对于为什么TForm的第一个构造函数会调用TForm2的第二个构造函数,而不是调用自己的第二个构造函数,请参考Thinking in C++ 292页。看不懂,唉。
ylm163net 2001-10-22
  • 打赏
  • 举报
回复
zealy是这个意思. 可是构造函数重栽,不应该是这样的
lyghe 2001-10-19
  • 打赏
  • 举报
回复
对于堆栈溢出的情况,我想可能是第一个和第二个构造函数互相反复调用的结果,不知道zealy是不是这个意思.
lyghe 2001-10-19
  • 打赏
  • 举报
回复
请看帮助TForm::TForm,TForm居然有三种构造函数:
__fastcall virtual TForm(Classes::TComponent* AOwner) : Forms::TCustomForm(AOwner) { }
__fastcall TForm(Classes::TComponent* AOwner, int Dummy) : Forms::TCustomForm(AOwner, Dummy) { }
__fastcall TForm(HWND ParentWindow) : Forms::TCustomForm(ParentWindow) { }

帮助下面第三段"Pass a Component and an integer to ...",我看不大懂,可能跟zealy所讲的有关.第二个参数int Dummy,"dummy"的中文意思是"傀儡",可能仅仅用来区别于第一个构造函数.第二个构造函数似乎用来从一个窗口文件中取得窗口的信息,不很清楚.请看懂了一定告诉我,多谢.
如不方便在这里讲述,我的E-Mail: lyghe@163.com ,QQ: 4398628
ylm163net 2001-10-19
  • 打赏
  • 举报
回复
声明成这种形式
__fastcall TForm2(TComponent *Owner,int a)
就有问题
lyghe 2001-10-19
  • 打赏
  • 举报
回复
不懂。试了一下,都是好的。
头文件:
private: // private user declarations
TMainForm *frmSecond;
int m_iA;
public: // public user declarations
virtual __fastcall TMainForm(TComponent* Owner);
virtual __fastcall TMainForm(TComponent* Owner, AnsiString strCaption);
virtual __fastcall TMainForm(AnsiString strCaption, TComponent* Owner);
主窗口:
__fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner)
{}
__fastcall TMainForm::TMainForm(TComponent* Owner, AnsiString strCaption) : TForm(Owner)
{ this->Caption = strCaption;
}
__fastcall TMainForm::TMainForm(AnsiString strCaption, TComponent* Owner) : TForm(Owner)
{ this->Caption = strCaption;
}
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
frmSecond = new TMainForm(1234, this);
frmSecond->Show();
}
void __fastcall TMainForm::Button2Click(TObject *Sender)
{
frmSecond = new TMainForm(this, 4321);
frmSecond->Show();
}
HEROIN 2001-10-19
  • 打赏
  • 举报
回复
佩服
ylm163net 2001-10-19
  • 打赏
  • 举报
回复
谢谢,应该是这个原因,我一直注意到第一个构造函数,没看第二个

但我仍然有疑问,构造函数应该只有一个被执行,因此,
当我 new TForm2(this) 的时候,应该不会造成递归

不过这个原因既然已经找到了,过几天添加分
zealy 2001-10-19
  • 打赏
  • 举报
回复
ylm163net:
你犯了一个错误,我试试看能否解释清楚:
1、在forms.hpp中TForm有两个构造函数:
/* 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) { };

2、你定义的构造函数与第二个构造函数相同,BCB认为你重载了此函数。
3、当你new一个TForm2时,不管你使用哪个构造函数,基类的构造函数均会被执行(因是虚拟的),然而你又重载了第二个基类构造函数,因此你的TForm2(Owner,int)也将紧跟被执行,但你的TForm2同时又要求执行TForm的构造函数,TForm的构造函数执行后又要求执行重载的构造函数TForm2(Owner,int),这就造成了一个死循环。
4、你的构造函数只要不是TForm2(Owner,int)的形式即可,如TForm2(Owner,float)什么的均可。
5、结论:
之一:这不是BCB的Bug,BCB只是不能发现这种错误。
之二:这是一种对C++的理解不足产生的人为错误。

lyghe 2001-10-18
  • 打赏
  • 举报
回复
事实上,相对该窗口的构造函数进行重载。
kingkee 2001-10-18
  • 打赏
  • 举报
回复
你可以这样做:
Form_Example=new TForm_Example(Application);
try
{
Form_Example->ShowModal();
}
__finally
{
delete Form_Example;
};
lyghe 2001-10-18
  • 打赏
  • 举报
回复
困惑
xxgxxggxxgxx 2001-10-18
  • 打赏
  • 举报
回复
先留个脚印!
ylm163net 2001-10-18
  • 打赏
  • 举报
回复
wangledong(快乐的程序员) :
这也不行
wangledong 2001-08-22
  • 打赏
  • 举报
回复
TForm2 *Form=new TForm(this, 1 );
ylm163net 2001-08-22
  • 打赏
  • 举报
回复
大家最好试一下,是运行时错误,非语法错误
ylm163net 2001-08-22
  • 打赏
  • 举报
回复
重申一遍:
我的程序中本来就是:
TForm2 *Form=new TForm2(this);
发问题的时候打错了
所以,大家不要从语法错误上入手,语法无错误


ylm163net 2001-08-22
  • 打赏
  • 举报
回复
刚才打字打错了
TForm2 *Form=new TForm2(this);

就是在这句话出错的
HEROIN 2001-08-22
  • 打赏
  • 举报
回复
TForm2 *Form=new TForm2(this);

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧