C++ 类参考

2023-12-02

来自 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 中,有limited支持 Delphi 元类。 C++编译器有一个__classid() and __typeinfo()用于检索 Delphi 兼容的扩展TMetaClass*派生自任何类的指针TObject。该指针可以按原样传递给 Delphi 代码(您可以在 C++Builder 项目中使用 Delphi .pas 文件)。

The TApplication::CreateForm()方法是在Delphi中实现的,并且有一个TMetaClass*C++ 中的参数(尽管有它的名字,它实际上可以实例化任何派生自的类)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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 类参考 的相关文章

  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str

随机推荐

  • JavaScript 中的 + + 运算符

    当我有一个加号时 我会得到错误的答案 例如 var b 069 var total 0 total total b console log total total 069 然而 当我添加第二个加号时 方程看起来像这样 total total
  • ggplot轴标题中斜体和上标的表达

    我很抱歉问这个问题 但我似乎无法正确地将这个表达式包含在ylab or xlab ggplot2 对象的参数 需要读一下 2q 稀有 不过 2 需要加上上标 我摆弄过expression and paste 但这似乎是不可能的 任何帮助深表
  • IEnumerable 到 FileStreamResult 的流

    我有一个IEnumerable
  • 删除文件权限被拒绝

    我遇到了 Stack Overflow 上有很多条目的问题 但没有一个解决了我的问题 我有这段代码 它尝试删除文件夹中的每个 txt 但我在 DeleteFile 命令上不断收到权限被拒绝的错误 directory C TEST FOLDE
  • Moodle注册表编辑

    我使用的是moodle 2 8 1 我的疑问是关于 Moodle 注册表 我想添加一个确认密码字段 该字段与电子邮件 再次 字段相同 并删除电子邮件 再次 字段 而且它也没有显示电话号码 注册表单中的字段处于解锁状态时 如果要向注册表单添加
  • 接收POST时出现404错误

    我需要使用 php 将 json POST 从 android 发送到 Web 服务器 我尝试了很多代码但不起作用 现在我尝试使用 Postman 进行简单的 POST 无论是否发送数据 并且总是收到404错误 如果我使用 GET 发送数据
  • 为什么多个类选择器不能与removeClass一起使用

    如何在一个声明中使用多个类来完成这项工作 div class ddd back7 d div div class fff back7 f div div class ggg back7 g div ddd fff ggg removeCla
  • 返回重复字母最多的第一个单词

    这是 coderbyte 的 Easy Set 中的一个问题 很多人已经问过这个问题 但我真的很好奇我的特定解决方案出了什么问题 我知道这是一个非常愚蠢且低效的解决方案 原问题 让函数 LetterCountI str 接受传递的 str
  • 从多个接口继承的方法上的 List 返回类型中的 Java 泛型

    我目前在一家拥有多种模块的公司工作 在该公司中 如果您想提供模块内部结构 您可以通过 java 接口提供它 该接口隐藏实际的实现类型并为请求模块提供接口 现在我希望有一个提供程序能够为多个模块提供数据 这些模块公开实际内部数据的不同字段或方
  • 逐行乘以数据框

    输入文件 df1 lt data frame row names c w x y z A c 0 0 0 0 B c 0 1 0 0 C c 1 0 1 0 D c 1 1 1 1 A B C D w 0 0 1 1 x 0 1 0 1 y
  • MVC 失去焦点时需要进行字段验证

    ASP NET MVC 必需 验证仅在以下条件之一触发 1 表格提交2 按 Tab 键进入字段 gt 输入一些文本 gt Tab 退出 gt Tab 返回字段 gt 删除文本 gt Tab 退出 我想以这种方式触发 if 按 T ab 键进
  • 温斯顿记录器不写入文件

    我想用winston登录node用于将错误记录到文件的应用程序 但winston不写入文件 var logger new winston Logger transports new winston transports Console ne
  • 有界通配符和类型参数有什么区别?

    之间有区别吗
  • 使用 JavaScript/ES6 的 for 循环创建可通过 Promise.all 读取的 fetch Promise 数组?

    因此 为了不让任何人对背景故事感到厌烦 我需要从许多 API 访问数据才能运行我的脚本 在执行脚本之前需要加载所有数据 我通常很乐意这样做 我只需声明一些获取请求 编写 Promise all 然后继续执行该函数 然而 我遇到了某个 API
  • 如何使用网站和php运行Docker容器?

    我有一个登陆页面和一个用于发送电子邮件 反馈表 的 PHP 文件 我想使用 Docker 测试这个表单 我写了这个 Dockerfile FROM php 7 4 cli COPY usr src app CMD php mail cont
  • 使用 get() 从卸载的包中调用函数而不使用库

    我想通过将函数名称存储在列表中来从卸载的包中调用函数 通常我只会使用 library shiny pagelist lt list type p object with the function name will be loaded fr
  • jQuery 中滚动条聚焦时如何禁用可拖动 div

    我有一个带有侧滚动条的 jQuery 可拖动容器 div 当我上下滚动时 该滚动条不应该是可拖动的 infotext 是包含文本的内部 div 包含在 infobody 中 设置为 Overflow auto 我需要一种方法来在选择滚动条时
  • MySQL 在逗号列表中搜索[重复]

    这个问题在这里已经有答案了 我有一个 MySQL 字段 其中引用了另一个表 其中 id 保存为逗号分隔列表 例如 12 13 14 16 代表另一个表中的值 我知道这是非常糟糕和错误的 但这来自上面 我对此无能为力 现在的问题是我想使用如下
  • 与其他浏览器相比,IE 中的页面加载速度非常慢

    当我加载我工作的网站的首页在 IE 中 完全加载大约需要 7 或 8 秒 也就是说 Waiting for and x items remaining 消失并变为 Done 完全相同的页面在 Firefox 和 Google Chrome
  • C++ 类参考

    来自 Delphi 我习惯于使用类引用 元类 如下所示 type TClass class of TForm var x TClass f TForm begin x TForm f x Create f ShowModal f Free