C++Builder __classid |
Top Previous Next |
What is translated > class-reference type > C++Builder __classid C++Builder has as counterpart to Delphi's TClass:
typedef TMetaClass* TClass
A Delphi class reference type is defined as TClass in C++Builder:
type TBaseClass = class of TBase;
->
typedef System::TMetaClass TBaseClass;
Variables of this type can be defined and classes can be assigned to them. For C++Builder the __classid function is a special extension, to get class references.
var p : TBase; bc :TBaseClass; begin bc := p;
->
TBase* p = nullptr; TBaseClass bc = nullptr; bc = __classid(p);
With such class references code such as:
ClassRef := Sender.ClassType;
while ClassRef <> NIL do begin s := ClassRef.ClassName); ClassRef := ClassRef.ClassParent; end;
can be translated pretty well as:
TClass ClassRef = Sender->ClassType();
while(ClassRef != nullptr) { s = ClassRef->ClassName(); ClassRef = ClassRef->ClassParent(); }
It is not possible however, to create an instance of a class from such a TClass. To do that, a small Delphi unit has to be added to the C++Builder project. The unit CreateClass.pas, which is delivered with Delphi2Cpp II contains the simple function:
function CreateObject(C: TClass) : TObject; begin Result := C.Create(); end;
When this unit is added to a C++Builder project, automatically a C++ header file "CreateClass.hpp" is created with the declaration:
extern DELPHI_PACKAGE System::TObject* __fastcall CreateObject(System::TClass C);
That function can be used now in the C++ code to create class instances from class references:
function make(Base: TBaseClass): TBase; begin result := Base.Create; end;
->
TBase* make(TBaseClass* Base) { TBase* result = nullptr; result = (TFBase*) CreateObject(Base); return result; }
If the class referenc of a class which is derived from TBase is passed to the make-function an instance of that class will be created.
p := make(TDerived); :
->
P = make(__classid(TDerived));
. |
This page belongs to the DelphiXE2Cpp11 Documentation |
DelphiXE2Cpp11 home Content |