@ferdasfarmazone
Верстальщик!

Как объяснить кусок кода C++?

Как объяснить кусок кода C++?
Файл Unit1.h
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TLabel *Label1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcallTForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Файл Unit1.cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Close();
}
//---------------------------------------------------------------------------
  • Вопрос задан
  • 674 просмотра
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Весь этот код (за исключением Close) — автогенерируемый.

///// Защита от повторного включения
#ifndef Unit1H
#define Unit1H

///// Хедеры VCL. Причём всё это сделано так, чтобы упростить написание ценой удлинения
///// компиляции. Более громоздкий, но и более удачный вариант.
///// В H:
/////   namespace Controls { class TLabel; }
/////   using namespace Controls;
///// В CPP:
/////   #include <Controls.hpp>
///// Вот таким образом можно (было) избавиться от каскадного подключения
///// хедера Controls. А то каждый, кто использует главной форму,
///// автоматически подключает эти хедеры.
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
///// Только от Forms.hpp избавиться таким макаром нельзя:
///// мы наследуемся от TForm.
#include <Forms.hpp>

///// Класс формы. Все формы наследуются от TForm.
class TForm1 : public TForm
{
   ///// Особое право доступа Borland, для совместимости с Delphi.
   ///// Поля и свойства published не просто public, но включаются
   ///// в структуру рефлексии (aka reflection или introspection)
   ///// и программа о них знает при выполнении.
   ///// Применительно к формам — published-поля доступны
   ///// загрузчику.
__published: // IDE-managed Components
   ///// Компоненты, которые мы установили на форме редактором.
TLabel *Label1;
TButton *Button1;
   ///// События, которые мы прописали в редакторе.
   ///// __fastcall — модель вызова, аналогичная Delphi.
   ///// Именно такая модель вызова принята в обработчиках
   ///// событий.
void __fastcall Button1Click(TObject *Sender);
   ///// Пользователь пока не прописал никаких своих
   ///// полей и функций.
private: // User declarations
public: // User declarations
   ///// Конструктор. Раз уж у формы нетривиальный конструктор —
   ///// по правилам Си++ его надо повторить в подклассе.
   ///// Снова-таки, модель вызова __fastcall: в формах Delphi
   ///// используются т.н. виртуальные конструкторы, 
   ///// когда по имени класса можно создать объект этого класса.
   ///// Фабричный метод, только немного лучше.
   ///// Но это значит: у всех подчинённых классов
   ///// должен быть один и тот же набор параметров
   ///// и модель вызова.
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
///// Как известно, переменная объявляется один раз.
///// Поскольку хедер может подключаться к огромному числу CPP,
///// её объявляют как extern (она есть, но в другом месте).
///// Макрос PACKAGE раскрывается в __declspec(package),
///// чтобы эту штуку можно было собрать как пакет.
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Модель вызова — это как технически мы вызываем подпрограмму. Какая память и какие регистры на это используются, и кто подчищает стек. Ищи в Википедии.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы