C++ 类引用

标签 c++ delphi rtti

来自 Delphi,我习惯像这样使用类引用(元类):

type
  TClass = class of TForm;
var
  x: TClass;
  f: TForm;
begin
  x := TForm;
  f := x.Create();
  f.ShowModal();
  f.Free;
end;

实际上,从 TObject 派生的每个类 X 都有一个名为 ClassType 的方法,该方法返回一个可用于创建 X 实例的 TClass。

在 C++ 中有类似的东西吗?

最佳答案

C++ 中不存在元类。部分原因是因为元类需要虚拟构造函数和从派生到基的创建顺序,这是 C++ 没有的两件事,但 Delphi 有。

但是,特别是在 C++Builder 中,对 Delphi 元类的支持有限。 C++ 编译器有一个 __classid()__typeinfo()用于检索从 TObject 派生的任何类的 Delphi 兼容 TMetaClass* 指针的扩展。该指针可以按原样传递给 Delphi 代码(您可以在 C++Builder 项目中使用 Delphi .pas 文件)。

TApplication::CreateForm() 方法在 Delphi 中实现,在 C++ 中有一个 TMetaClass* 参数(尽管它的名字,它实际上可以实例化派生的任何类来自 TComponent,如果您不介意将 TApplication 对象指定为 Owner),例如:

TForm *f;
Application->CreateForm(__classid(TForm), &f);
f->ShowModal();
delete f;

或者,如果您需要更多地控制构造函数调用,您可以编写自己的自定义 Delphi 代码:

unit CreateAFormUnit;

interface

uses
  Classes, Forms;

function CreateAForm(AClass: TFormClass; AOwner: TComponent): TForm;

implementation 

function CreateAForm(AClass: TFormClass; AOwner: TComponent): TForm;
begin
  Result := AClass.Create(AOwner);
end;

end.

#include "CreateAFormUnit.hpp"

TForm *f = CreateAForm(__classid(TForm), SomeOwner);
f->ShowModal();
delete f;

关于C++ 类引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23165000/

相关文章:

c++ - "rdtsc": "=a" (a0), "=d"(d0) 这是做什么的?

database - 如何从数据库中获取 Excel 文件 (BLOB) 并对其进行读/写操作?

c++ - 显式类型标识符与 RTTI

c++ - Qmake 项目文件

c++ - 对 C++ 类继承有点生疏

c++ - 运算符重载时的继承和 "invalid covariant return type"错误

delphi - 删除问号

delphi - 在数据集过滤器中使用 coalesce()

delphi - Delphi 中对象的 RTTI

arrays - RTTI 动态数组 TValue Delphi 2010