c++ - 在 C++Builder 中重载 MainForm 构造函数

标签 c++ c++builder

我需要在 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/

相关文章:

c++builder - 在 borland c++ builder 中的表单之间传输数据

c++ - 未实例化模板函数的处理

c++ - 基本类型数组的迭代器类型

c++ - 如何更正下面的 C++ 代码?

c++ - 简单的光线追踪器,漫反射着色问题c++

c - 如何用(可读的)UTF8 字符写入文件?

c++指示器/加载轮

c++builder - borland c++ builder如何用包制作exe文件

c++ - 在 LINUX 上使用 C++ 的 LAPACK/LAPACKE --- 编译、链接和运行?

c++ - 为什么 C++ 关联容器谓词默认不透明?