我需要在 radStudio C++ 应用程序中重载主窗体的构造函数。在 Delphi 中,这可以通过关键字重载来完成,但我找不到在 C++ 中执行此操作的方法。这个想法是将对 Controller 类的引用作为构造函数参数传递,以实现 MVC 模型。问题是由于使用Application->CreateForm(..)
引起的。
Delphi 示例
Constructor Create; overload; // This constructor uses defaults
Constructor Create(name : string); overload;
最佳答案
C++ 中没有overload
关键字,也不需要。只需根据需要定义您的重载,编译器足够智能,可以检测同名的重载。
当您在 C++Builder 中创建一个新的 TForm 时,IDE 已经为您提供了一个与 Application->CreateForm()
兼容的构造函数,例如:
class TMainForm : public TForm
{
...
public:
__fastcall TMainForm(TComponent *Owner);
};
您当然可以根据需要定义额外的重载构造函数,例如:
class TMainForm : public TForm
{
...
public:
__fastcall TMainForm(TComponent *Owner);
__fastcall TMainForm(String name);
};
请注意,CreateForm()
将无法调用除默认的 TComponent*
构造函数之外的任何重载构造函数。另一方面,您不应该使用 CreateForm()
来构造 Application->MainForm
之外的任何 TForm 对象。相反,使用 new
运算符直接调用所需的构造函数,例如:
TMainForm *form = new TMainForm("My name here");
这同样适用于 Delphi。只对MainForm
调用CreateForm()
,其他构造函数根据需要直接调用。事实上,在 Delphi 中,您通常根本不需要 重载
构造函数,您可以简单地使用不同的名称定义额外的构造函数,例如:
TMainForm = class(TForm)
...
public
constructor Create(Owner: TComponent); override;
constructor CreateWithName(name: string);
end;
var
form: TMainForm;
...
form := TMainForm.CreateWithName('My name here');
你不能在 C++ 中这样做,因为所有构造函数必须与类类型具有相同的名称。
如果您发现以上内容在 C++ 中对您不起作用,那么根本不要重载构造函数。请改用静态类方法,例如:
class TMainForm : public TForm
{
...
public:
__fastcall TMainForm(TComponent *Owner);
static TMainForm* __fastcall Create(String name)
{
TMainForm *form = new TMainForm(NULL);
form->Name = name;
return form;
}
};
...
TMainForm *form = TMainForm::Create("My name here");
关于c++ - 在 C++Builder 中重载 MainForm 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55111235/