成员函数指针和继承

2023-12-10

因此,为了方便起见,我正在开发一个简单的 win32 包装器,但我遇到了一个稍微复杂的问题。

这还有很多其他成员,但我省略了一些,只留下有问题的成员。

class Windows::AbstractWindow
{
public:
     void InstallHandler(UINT msgName, void (Windows::AbstractWindow::*)(HWND, UINT, WPARAM, LPARAM));

private:
     std::map<UINT, void (Windows::AbstractWindow::*)(HWND, UINT, WPARAM, LPARAM)> HandlerIndex;

};

(郑重声明,本例中的 Windows 是我创建的各种类和对象的命名空间)

只是有点令人讨厌,但让我解释一下我的过程和推理。我创建了一个名为 Abstract Window 的类,它以非常面向对象的方式包含窗口的大部分功能。

我现在正在研究一种获取私有成员函数的方法,并通过指向它们的指针将它们存储在映射中,这些指针由它们应该处理的 Windows 消息标识。这样,当 Windows 过程收到消息时,它会深入查看此映射以查看您是否已为其安装了处理程序。如果有,则调用该函数并退出。如果没有,它将调用 DefWindowProc 并退出。很容易。

然而,这个对象永远不应该被实例化,而只是应该继承和扩展。问题是,map 的函数指针声明是 AbstractWindow 类型,它不允许我存储从 AbstractWindow 继承的类型的成员函数指针。例如,

class BasicWindow : public Windows::AbstractWindow
{
public:
    BasicWindow() 
    {
         InstallHandler(WM_CREATE, &create);
    }

private:
    void Create(HWND, UINT, WPARAM, LPARAM) {}
}

...产生错误:

error C2664: 'Windows::AbstractWindow::InstallHandler' : cannot convert parameter 2 from 'void (__thiscall BasicWindow::* )(HWND,MSG,WPARAM,LPARAM)' to 'void (__thiscall Windows::AbstractWindow::* )(HWND,UINT,WPARAM,LPARAM)'

因为尽管是从基类继承的,但指针类型并不相同。那么有人希望在保留这种方法的同时提出一个解决方案吗?如果没有,我也愿意接受您认为会使消息处理比这种方式更方便的建议。


您应该阅读奇怪的重复模板模式(http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern).

基本上,您将基类转换为带有指定子类的模板参数的模板。

如果你看到它,也许会更容易理解:

namespace Windows
{
     template <typename T>
     class AbstractWindow
     {
     public:
          void InstallHandler(UINT msgName, void (T::*)(HWND, UINT, WPARAM, LPARAM));

     private:
          std::map<UINT, void (T::*)(HWND, UINT, WPARAM, LPARAM)> HandlerIndex;

     };
}

class BasicWindow : public Windows::AbstractWindow< BasicWindow >
{
public:
    BasicWindow() 
    {
         InstallHandler(WM_CREATE, &BasicWindow::Create);
    }

private:
    void Create(HWND, UINT, WPARAM, LPARAM) {}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

成员函数指针和继承 的相关文章

  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • WP8.1 C# 绑定联系人图像

    信息很简单 我正在尝试创建一个可以显示用户联系人的应用程序 我也是一名自学成才的程序员 所以我在某些方面有编程经验 但总体来说我对数据绑定相对较新 首先 我有一个 ListView 控件 其中包含图像绑定
  • 如何启动异步任务对象

    我想开始收集Task同时处理对象并等待所有对象完成 下面的代码显示了我想要的行为 public class Program class TaskTest private Task createPauseTask int ms works w
  • 使用预编译头减少 clang 编译时间

    我正在开发一个数据库项目 该项目将查询 以某种高级语言表示 编译为 C 代码 这段代码由数据库编译并执行 那部分工作得很好 现在 我正在尝试减少 C 查询代码的编译时间 我想知道是否可以使用预编译头来提高性能 该查询被转换为一个名为 Que
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • “包含字符串”的快速索引

    在我的应用程序中 我有多达数百万个短字符串 大部分短于 32 个字符 我想实现一个带有附加列表的搜索框 该列表仅包含包含在搜索框中输入的整个字符串的元素 如何预先建立索引来快速找到此类字符串 所有排序的 STL 容器都会检查整个字符串 对于
  • 将 Python 控制台集成到 GUI C++ 应用程序中

    I m going to add a python console widget into a C GUI below some other controls 许多类将暴露给 python 代码 包括一些对 GUI 的访问 也许我会考虑 P
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • printf() 使用字符串表“解码器环”调试库

    我写这封信是想看看你们中是否有人见过或听说过我即将描述的想法的实现 我有兴趣为嵌入式目标开发 printf 风格的调试库 目标非常遥远 并且我和目标之间的通信带宽预算非常紧张 因此我希望能够以非常有效的格式获取调试消息 通常 调试语句如下所
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方

随机推荐

  • 如何从 Get-ChildItem 获取所有可执行文件的路径

    我目前正在尝试获取所有已安装应用程序的列表 并希望构建一个可以启动这些应用程序的功能 我正在使用这些 PowerShell 命令 gci HKLM SOFTWARE Microsoft Windows CurrentVersion Unin
  • ObjectInputStream available() 方法未按预期工作(Java)

    我一直试图找出为什么我编写的从文件中读取对象的方法不起作用 并意识到即使文件没有完全读取 ObjectInputStream 的 available 方法也会给出 0 在我使用 FileInputStream available 方法来确定
  • 如何在 Visual Code Editor 中为 C++ 项目准备/配置开发环境?

    我正在使用 Nodejs 和可视化代码编辑器处理 JavaScript 项目 我想知道是否可以为 C 项目配置如此出色的代码编辑器 我想链接调试器并制作一些热键来构建debug release项目的版本 C 项目是否可行 我应该为此做什么
  • 为方法调用的每个实例返回相同的值

    嗨 我没有使用 PowerMockito 而是使用普通的 PowerMockito 并尝试模拟如下内容 when any File class canWrite thenReturn Boolean FALSE 但我得到一个NullPoin
  • 如何在android中制作带有进度状态的圆形进度条?

    我想显示如下图所示的进度条以及进度状态 任何人都可以给我解决方案吗 None
  • 使用malloc动态创建字符串数组

    我正在尝试使用 C 语言创建一个字符串数组malloc 数组将保存的字符串数量可以在运行时更改 但字符串的长度将始终保持一致 我已经尝试过这个 见下文 但是遇到了麻烦 任何正确方向的提示将不胜感激 define ID LEN 5 char
  • 属性的属性有意义吗?

    因为这是一个关于设计的问题 所以我首先会说我拥有什么和我想要什么 I have使用组合的设计 ACell对象持有一个Shape and a Background对象 本例中是定制的 这两个都有自己的数据来定义它们 这是代码中的示例 clas
  • grep 匹配某个模式的行,以及匹配前后的行,直到不同模式

    Start pattern abc d End pattern Start pattern abc d ef ghij klm no End pattern Start pattern abc def hij End pattern Sta
  • 更快(更具可扩展性)的DataSet.Merge?

    我们在应用程序中使用强类型数据集 导入数据时我们使用方便的DataSet Merge 将 DataRows 从一个 DataSet 复制到另一个 DataSet 的操作 StringCollection lines ReadFromFile
  • Git 将修补程序分支合并到功能分支

    假设我们在 Git 中有以下情况 创建的存储库 mkdir GitTest2 cd GitTest2 git init master 中发生一些修改并提交 echo On Master gt file git commit a m Init
  • 使用 Google Apps 脚本删除 Google 文档中的表格行

    我正在尝试使用 Google Apps 脚本使用从电子表格到 Google 的信息来大量创建文档 但我不知道如何使用 Table 类 特别是方法 RemoveRow 我创建了一个示例 不太复杂 来说明我的问题 我有一个名为 销售报告 该文档
  • JavaScript 每次调用函数时都会编译该函数吗?

    假设我有这个功能 function A function B return 1 return 1 B 是否起作用B每次调用函数时都会编译A 我记得有人说不会 但我的记忆力已经生锈了 找不到参考资料 JavaScript 标准规定 JavaS
  • 某些三星设备上的编辑文本有限?

    我正在尝试将长文本从 SD 卡读取到 Android 中的编辑文本中 在几乎所有设备上 除了某些三星设备外 此功能都运行良好 当我尝试读取超过 10kb 的任何内容时 我读取的字符串也会获取整个文件 当我尝试将其添加到编辑文本时 它在 10
  • 如何在脚本内触发大括号扩展?

    我正在编写一个需要使用 shell 的大括号扩展的脚本 但我尝试过的任何方法都不起作用 对于 人为的 实例 假设我有一个包含字符串的变量 thing 01 02 我 显然 想将其扩展到 thing01 thing02 从脚本内部 我该怎么做
  • 为什么删除 DOCTYPE 后高度 100% 仍有效?

    这是整个代码 div style background color green height 100 width 100 div 什么也没有出现 但是如果我删除第一行 doctype 所有页面如预期一样都是绿色的 我有两个问题 我该如何制作
  • UIActivityViewController 相当于 ios 5

    我正在尝试分享应用程序中的一些文本 如果用户安装了ios 6我将调用UIActivityViewController来共享 但是 如果用户有 ios 5 是否有类似的东西我可以调用 并且有按钮可以分享到邮件和 Twitter 在 ios 5
  • 什么时候需要在Python中的整数两边添加引号[重复]

    这个问题在这里已经有答案了 我刚刚了解到Python中没有整数的引号 但为什么在这种情况下需要它 character name Tom age 50 print There once was a man named character na
  • API 平台 JWT:找不到“GET /api/login”的路由

    我成功安装了 API 平台 它与我的所有实体配合良好 现在我正在尝试使用 LexikJWTAuthenticationBundle 添加 JWT 身份验证 但是当我发送登录请求时 我得到 找不到 GET api login 的路由 我的请求
  • 如何使用JS传播剩余破坏来删除嵌套属性?

    尝试使用扩展运算符剩余破坏来删除多个属性 因此药物名称被删除 但我有嵌套对象mailPrice copayEmployer那并没有被破坏 你知道什么是错误实施的吗 main js const transformedResponse tran
  • 成员函数指针和继承

    因此 为了方便起见 我正在开发一个简单的 win32 包装器 但我遇到了一个稍微复杂的问题 这还有很多其他成员 但我省略了一些 只留下有问题的成员 class Windows AbstractWindow public void Insta