tru*_*ker 5 c++ stack-overflow constructor c++builder c++builder-6
这是我的程序使用的类层次结构:

TForm_Upgrade_Database的构造函数如下所示:
__fastcall TForm_Upgrade_Database :: TForm_Upgrade_Database(TComponent*Owner,int newest_version):TForm(Owner){}
在尝试创建公式的实例之后
TForm_Upgrade_Database *dlg = new TForm_Upgrade_Database(this, newest_version);
Run Code Online (Sandbox Code Playgroud)
我的程序抛出EStackOverflow异常

我停止了程序并在TForm_Upgrade_Database构造函数中使用断点再次运行它.几步之后callstack看起来像这样:

如何TCustomForm构造函数继续尝试调用其后代的构造函数???
最小的测试用例:
so_project.cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "f_form.h"
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
TForm_Upgrade_Database *form = new TForm_Upgrade_Database(NULL, 10);
delete form;
form = NULL;
return 0;
}
//---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
f_form.cpp:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "f_form.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm_Upgrade_Database *Form1;
//---------------------------------------------------------------------------
__fastcall TForm_Upgrade_Database::TForm_Upgrade_Database(TComponent* Owner, int x)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
f_form.h:
//---------------------------------------------------------------------------
#ifndef f_formH
#define f_formH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm_Upgrade_Database : public TForm
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TForm_Upgrade_Database(TComponent* Owner, int x);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm_Upgrade_Database *Form1;
//---------------------------------------------------------------------------
#endif
Run Code Online (Sandbox Code Playgroud)
TForm有一个虚拟构造函数,它按顺序接受TComponent*和参数。int您正在重写该构造函数。通过调用仅接受参数的基类构造函数TComponent*,当这些构造函数在内部相互调用时,您实际上创建了一个递归循环。
解决办法就是求真者所说的。您必须更改派生构造函数的参数,以便不再覆盖基类TComponent*/int构造函数。更改参数的顺序就足够了,或者您可以将其更改int为不同的数据类型。
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |