gpt4 book ai didi

C++ 类引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:27 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com