Перегрузка конструктора MainForm в C ++ Builder - PullRequest
0 голосов
/ 12 марта 2019

Мне нужно перегрузить конструктор главной формы в приложении radStudio C ++.В Delphi это можно сделать с помощью перегрузки ключевого слова, но я не могу найти способ сделать это в C ++.Идея состоит в том, чтобы передать в качестве аргумента конструктора ссылку на класс контроллера для реализации модели MVC.Проблема вызвана использованием Application-> CreateForm (..).

Пример Delphi

Constructor Create; overload;   // This constructor uses defaults

Constructor Create(name : string); overload;

1 Ответ

5 голосов
/ 12 марта 2019

В C ++ нет ключевого слова overload и оно не нужно. Просто определите ваши перегрузки по мере необходимости, компилятор достаточно умен, чтобы обнаружить перегрузки с тем же именем.

Когда вы создаете новую TForm в C ++ Builder, 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() для создания каких-либо объектов TForm , кроме Application->MainForm. Вместо этого используйте оператор new для непосредственного вызова нужного конструктора, например:

TMainForm *form = new TMainForm("My name here");

То же самое относится и к Delphi. Вызывайте CreateForm() только для MainForm и при необходимости вызывайте другие конструкторы. На самом деле, в Delphi вам, как правило, вообще не нужно overload конструкторов, вы можете просто определить дополнительные конструкторы, используя разные имена, например:

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");
...