Тема: Віртуальний конструктор Builder C++

Майже в кожного класу в Builder C++, який описує будь-який компонент, є віртуальний конструктор. Я пробував погуглить щось таке зайшов, але це трохи не таке бо в Builder C++ так і пишеться virtual ім'я конструктора, ось наприклад

public:
    /* TCustomButton.Create */ inline __fastcall virtual TButton(System::Classes::TComponent* AOwner) : TCustomButton(AOwner) { }
клас
class PASCALIMPLEMENTATION TButton : public TCustomButton
{
    typedef TCustomButton inherited;
    
private:
    // __classmethod void __fastcall Create@();
    // __classmethod void __fastcall Destroy@();
    
__published:
    __property Action;
    __property Align = {default=0};
    __property Anchors = {default=3};
    __property BiDiMode;
    __property Cancel = {default=0};
    __property Caption = {default=0};
    __property CommandLinkHint = {default=0};
    __property Constraints;
    __property Default = {default=0};
    __property DisabledImageIndex = {default=-1};
    __property DoubleBuffered;
    __property DragCursor = {default=-12};
    __property DragKind = {default=0};
    __property DragMode = {default=0};
    __property DropDownMenu;
    __property ElevationRequired = {default=0};
    __property Enabled = {default=1};
    __property Font;
    __property HotImageIndex = {default=-1};
    __property ImageAlignment = {default=0};
    __property ImageIndex = {default=-1};
    __property ImageMargins;
    __property Images;
    __property ModalResult = {default=0};
    __property ParentBiDiMode = {default=1};
    __property ParentDoubleBuffered = {default=1};
    __property ParentFont = {default=1};
    __property ParentShowHint = {default=1};
    __property PopupMenu;
    __property PressedImageIndex = {default=-1};
    __property SelectedImageIndex = {default=-1};
    __property ShowHint;
    __property Style = {default=0};
    __property StylusHotImageIndex = {default=-1};
    __property TabOrder = {default=-1};
    __property TabStop = {default=1};
    __property Visible = {default=1};
    __property WordWrap = {default=0};
    __property StyleElements = {default=7};
    __property OnClick;
    __property OnContextPopup;
    __property OnDragDrop;
    __property OnDragOver;
    __property OnDropDownClick;
    __property OnEndDock;
    __property OnEndDrag;
    __property OnEnter;
    __property OnExit;
    __property OnKeyDown;
    __property OnKeyPress;
    __property OnKeyUp;
    __property OnMouseActivate;
    __property OnMouseDown;
    __property OnMouseEnter;
    __property OnMouseLeave;
    __property OnMouseMove;
    __property OnMouseUp;
    __property OnStartDock;
    __property OnStartDrag; 
public:
    /* TCustomButton.Create */ inline __fastcall virtual TButton(System::Classes::TComponent* AOwner) : TCustomButton(AOwner) { }
    /* TCustomButton.Destroy */ inline __fastcall virtual ~TButton(void) { }
    
public:
    /* TWinControl.CreateParented */ inline __fastcall TButton(HWND ParentWindow) : TCustomButton(ParentWindow) { }
    
};

Так де він там взявся якщо це С++, і як їм користуватися ?

Подякували: coder1

2

Re: Віртуальний конструктор Builder C++

Betterthanyou написав:

Так де він там взявся якщо це С++

Ви абсолютно праві: це не C++, це Delphi. Бібліотеки Delphi підкрутили під C++, прив'язавши віртуальний метод Create до конструктора.

холівар
Betterthanyou написав:

і як їм користуватися ?

Ніяк. Я про C++ Builder. Не треба ним користуватися.

Подякували: coder1

3

Re: Віртуальний конструктор Builder C++

koala написав:
холівар

Ніяк. Я про C++ Builder. Не треба ним користуватися.

Чому би й ні?

Подякували: coder1

4 Востаннє редагувалося Betterthanyou (02.12.2015 00:20:58)

Re: Віртуальний конструктор Builder C++

Добре, приведу приклад мені потрібно дещо змінити в кнопці (Button), я пишу клас якій наслідуватиме TButton поля public

class MyTButton : public TButton
{
int data;
};

але мені потрібно конструктору передати об'єкт форми(Form1) на яком я хочу створити свою кнопку, в базовому класі(TButton який не зовсім є базовий public TCustomButton) конструктор цей виглядає так

inline __fastcall virtual TButton(System::Classes::TComponent* AOwner) : TCustomButton(AOwner) { }

або так   

inline __fastcall TButton(HWND ParentWindow) : TCustomButton(ParentWindow) { }

я ще не знаю якому точно конструктору я маю передавати об'єкт Form1, але скорій всього першому і як мені це зробити ?

Подякували: coder1

5

Re: Віртуальний конструктор Builder C++

Просто берете і ініціалізуєте, в чому проблема?

Подякували: coder1

6

Re: Віртуальний конструктор Builder C++

koala написав:

Просто берете і ініціалізуєте, в чому проблема?

як?  як це зробити?

7 Востаннє редагувалося koala (02.12.2015 00:54:59)

Re: Віртуальний конструктор Builder C++

Ви питаєте, як ініціалізувати об'єкт базового класу в конструкторі нащадка? Знущаєтеся, чи що?

8 Востаннє редагувалося Betterthanyou (02.12.2015 02:43:09)

Re: Віртуальний конструктор Builder C++

coder написав:
koala написав:

Просто берете і ініціалізуєте, в чому проблема?

як?  як це зробити?

Я не зрозумів чи це ви від себе задали питання чи від мене, але в будь-якому випадку давайте пригадаємо як це можна зробити

#include <iostream>
#include <conio.h>
using namespace std;
//
class A
{
protected:
    int var_k;
public:
    A(int k = 0) : var_k(k) {};
    int get_k();
};

int A::get_k()
{
    return var_k;
}
//

//
class B : public A
{
public:
    B(int k = 0) : A::A(k) {};
};
//

int main()
{
    //Статично
    B::A ob(7);//Перший спосіб
    cout << ob.get_k();

    cout << endl;

    B ob2(2);//Другий спосіб
    cout << ob2.get_k();

    cout << endl;

    //Динамічно
    B::A* ob3 = new B::A(65);//Перший спосіб
    cout << ob3->get_k();

    cout << endl;

    B* ob4 = new B(43);//Другий спосіб
    cout << ob4->get_k();


    getch();
    return 0;
}

Наприклад класу А і В я продемонстрував два варіанти як це можна зробити ob - за допомогою конструктора класу А, і В(ob2) класі за допомогою свого конструктора який викликає конструктор А. Якщо я щось не правильно написав чи є ще якісь способи поправте мене.

Тепер повернемося до мого питання

при спробі аналогічній з класом А в мене нічого не виходить

MyTButton::TButton* NewMyTButton = new MyTButton::TButton(Form3);
Прихований текст

[bcc32 Error] Unit3.cpp(197): E2451 Undefined symbol 'TButton'
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(197): E2451 Undefined symbol 'NewMyTButton'
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(197): E2303 Type name expected
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(197): E2379 Statement missing ;
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(242): E2060 Illegal use of floating point
  Full parser context
    Unit3.cpp(230): parsing: void _fastcall TForm3::ОКClick(TObject *)

ну і через конструктор

class MyTButton : public TButton
{
int data;
MyTButton(System::Classes::TComponent* AOwner) : MyTButton::TButton(System::Classes::TComponent* AOwner) {};
};
Прихований текст

[bcc32 Error] Unit3.h(25): E2113 Virtual function 'MyTButton::MyTButton(TComponent *)' conflicts with base class 'TButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
[bcc32 Error] Unit3.h(25): E2312 'TButton' is not an unambiguous base class of 'MyTButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
    Unit3.h(27): decision to instantiate:  MyTButton::MyTButton(TComponent *)
    --- Resetting parser context for instantiation...
    Unit3.h(25): parsing:  MyTButton::MyTButton(TComponent *)
[bcc32 Error] Unit3.h(25): E2251 Cannot find default constructor to initialize base class 'TButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
    Unit3.h(27): decision to instantiate:  MyTButton::MyTButton(TComponent *)
    --- Resetting parser context for instantiation...
    Unit3.h(25): parsing:  MyTButton::MyTButton(TComponent *)
[bcc32 Warning] Unit3.cpp(136): W8004 'str' is assigned a value that is never used
  Full parser context
    Unit3.cpp(32): parsing: void _fastcall TForm3::Button1Click(TObject *)
[bcc32 Error] Unit3.cpp(197): E2247 'MyTButton::MyTButton(TComponent *)' is not accessible
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(209): E2316 'id' is not a member of 'MyTButton'
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(242): E2060 Illegal use of floating point
  Full parser context
    Unit3.cpp(230): parsing: void _fastcall TForm3::ОКClick(TObject *)

koala написав:

Ви питаєте, як ініціалізувати об'єкт базового класу в конструкторі нащадка? Знущаєтеся, чи що?

Не знущаюсь я серйозно

9 Востаннє редагувалося koala (02.12.2015 07:48:32)

Re: Віртуальний конструктор Builder C++

Ініціалізація - це виклик, а не проголошення:

MyTButton(System::Classes::TComponent* AOwner) 
    : MyTButton::TButton(AOwner) 
{};
Подякували: Betterthanyou1

10

Re: Віртуальний конструктор Builder C++

koala написав:

Ініціалізація - це виклик, а не проголошення:

MyTButton(System::Classes::TComponent* AOwner) 
    : MyTButton::TButton(AOwner) 
{};

Та я і так пробував

class MyTButton : public TButton
{
int data;
MyTButton(System::Classes::TComponent* AOwner) : MyTButton::TButton(AOwner) {};
};
Error

[bcc32 Error] Unit3.h(25): E2113 Virtual function 'MyTButton::MyTButton(TComponent *)' conflicts with base class 'TButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
[bcc32 Error] Unit3.h(25): E2312 'TButton' is not an unambiguous base class of 'MyTButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
    Unit3.h(27): decision to instantiate:  MyTButton::MyTButton(TComponent *)
    --- Resetting parser context for instantiation...
    Unit3.h(25): parsing:  MyTButton::MyTButton(TComponent *)
[bcc32 Error] Unit3.h(25): E2251 Cannot find default constructor to initialize base class 'TButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
    Unit3.h(27): decision to instantiate:  MyTButton::MyTButton(TComponent *)
    --- Resetting parser context for instantiation...
    Unit3.h(25): parsing:  MyTButton::MyTButton(TComponent *)
[bcc32 Warning] Unit3.cpp(136): W8004 'str' is assigned a value that is never used
  Full parser context
    Unit3.cpp(32): parsing: void _fastcall TForm3::Button1Click(TObject *)
[bcc32 Error] Unit3.cpp(197): E2247 'MyTButton::MyTButton(TComponent *)' is not accessible
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(209): E2316 'id' is not a member of 'MyTButton'
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(242): E2060 Illegal use of floating point
  Full parser context
    Unit3.cpp(230): parsing: void _fastcall TForm3::ОКClick(TObject *)

пробував так як Builder C++

class MyTButton : public TButton
{

int data;

inline __fastcall virtual MyTButton(System::Classes::TComponent* AOwner) : MyTButton::TButton(AOwner) {};

};
Error

[bcc32 Error] Unit3.h(25): E2312 'TButton' is not an unambiguous base class of 'MyTButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
    Unit3.h(27): decision to instantiate:  _fastcall MyTButton::MyTButton(TComponent *)
    --- Resetting parser context for instantiation...
    Unit3.h(25): parsing:  _fastcall MyTButton::MyTButton(TComponent *)
[bcc32 Error] Unit3.h(25): E2251 Cannot find default constructor to initialize base class 'TButton'
  Full parser context
    Unit3.cpp(7): #include Unit3.h
    Unit3.h(20): class MyTButton
    Unit3.h(27): decision to instantiate:  _fastcall MyTButton::MyTButton(TComponent *)
    --- Resetting parser context for instantiation...
    Unit3.h(25): parsing:  _fastcall MyTButton::MyTButton(TComponent *)
[bcc32 Warning] Unit3.cpp(136): W8004 'str' is assigned a value that is never used
  Full parser context
    Unit3.cpp(32): parsing: void _fastcall TForm3::Button1Click(TObject *)
[bcc32 Error] Unit3.cpp(197): E2247 '_fastcall MyTButton::MyTButton(TComponent *)' is not accessible
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(209): E2316 'id' is not a member of 'MyTButton'
  Full parser context
    Unit3.cpp(174): parsing: void _fastcall TForm3::DBGrid1DrawColumnCell(TObject *,const TRect &,int,TColumn *,TGridDrawState)
[bcc32 Error] Unit3.cpp(242): E2060 Illegal use of floating point
  Full parser context
    Unit3.cpp(230): parsing: void _fastcall TForm3::ОКClick(TObject *)

11

Re: Віртуальний конструктор Builder C++

Вибачте

MyTButton(System::Classes::TComponent* AOwner) : TButton(AOwner) {};

же.

Подякували: Betterthanyou1

12

Re: Віртуальний конструктор Builder C++

koala написав:

Вибачте

MyTButton(System::Classes::TComponent* AOwner) : TButton(AOwner) {};

же.

Щось я не уважний

class MyTButton : public TButton
{
int data;
MyTButton(System::Classes::TComponent* AOwner) : TButton(AOwner) {};
};

тут знову помилка  Virtual function 'MyTButton::MyTButton(TComponent *)' conflicts with base class 'TButton'
якщо добавити virtual

class MyTButton : public TButton
{
int data;
inline __fastcall virtual MyTButton(System::Classes::TComponent* AOwner) : TButton(AOwner) {};
};

то в класі помилок немає, значить все таки навіщось той virtual потрібний (хоча це не так важливо головне що працює)

13

Re: Віртуальний конструктор Builder C++

Це примочки від Delphi, я не можу точно сказати, якого біса так. В чистому C++ віртуальних конструкторів нема.

14

Re: Віртуальний конструктор Builder C++

Ну так буде в мене віртуальний конструктор чи ні? Давай бігом показу як його створювати.