来自 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/