将 C++ 实例方法与 C 回调函数混合

2024-02-15

problem

我有一个来自 C 库的以下 C 回调签名Foo:

void (* RequestCallbackFunc)(int)

该库还提供了用于注册所述回调的实用函数。

extern void SetRequestCallback(RequestallbackFunc request_cbf);

我有一个 C++ 课程App使用实例方法HandleRequest。正确的拥有方式是什么HandleRequest打电话时request_cbf叫做?

我天真的解决方案

App.hpp

#include <Foo.h> // include my C library

#include <Bar.hpp>

class App {
    public:
        App();
        ~App();

        void HandleRequest(int x);
    public:
        Bar * bar_; // raw pointer for demonstration purposes
}

App.cpp

#include "App.hpp"

extern "C" {
    static void handle_request(int x);
}

static void handle_request(int x) {
    static std::auto_ptr<App> my_app( new App() );
    my_app->HandleRequest(x);
}

App::App() {
    SetRequestCallback( handle_request );
    bar_ = new Bar();
}

App::~App() {
    delete bar_;
}

void App::HandleRequest(int x) {
    bar_->DoSomething( x );
    // more 'work'...
}

我是否以正确的方式处理这个问题?是否有其他方法可以将 C++ 与 C 回调连接起来?


这样做的目的是什么int回调中的参数?

设计良好的 C 接口 API 通常提供一种将“状态”参数传递给 C 函数回调的方法(可用于传递一些信息,例如 C++ 类实例)this指针),如创建线程 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx's LPVOID lpParameter.

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

将 C++ 实例方法与 C 回调函数混合 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • 如何设置 log4net 每天将我的文件记录到不同的文件夹中?

    我想将每天的所有日志保存在名为 YYYYMMdd 的文件夹中 log4net 应该根据系统日期时间处理创建新文件夹 我如何设置它 我想将一天中的所有日志保存到 n 个 1MB 的文件中 我不想重写旧文件 但想真正拥有一天中的所有日志 我该如
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 如何从 ODBC 连接获取可用表的列表?

    在 Excel 中 我可以转到 数据 gt 导入外部数据 gt 导入数据 然后选择要使用的数据源 然后在提供登录信息后 它会给我一个表格列表 我想知道如何使用 C 以编程方式获取该列表 您正在查询什么类型的数据源 SQL 服务器 使用权 看

随机推荐

  • Prawn - 在 text_box 展开后向下移动光标

    我正在使用 Prawn Gem 生成 PDF 但我无法找到移动 PDF 的方法cursor之后下来text box从溢出文本扩展 类似于常规的方式text打电话会 文本框示例 pad 5 text box payable at gt bou
  • Play 框架和 sbt:将凭据传递到 Nexus 密码保护的存储库

    我需要将以下库定义为依赖项 url http deploy cloud testmx com 8081 nexus content groups public http deploy cloud testmx com 8081 nexus
  • 使用 Typescript 热重载 IIS Web 服务器做出反应

    在使用 C Web Api 后端使用 TypeScript 开发 React 应用程序时 我想使用热重载 我使用 Net 框架而不是 Core 所以我需要使用 IIS 或 IIS Express 我可以使用前端热重载webpack dev
  • 在VS2015 RC上添加Native Tools命令提示符

    由于我在以下位置找不到 Native Tools CMDTools菜单 我尝试手动添加它外部工具 几个问题 不管我选择什么Command ARM x86 或 x64 等 Command总是C Windows System32 cmd exe
  • 在Android中使用Bundle代替直接Intent putExtra()的优点

    在我的android应用程序中我总是直接使用putExtra 的函数Intent类将任意数量的值传递给 newActivity 像这样 Intent i new Intent this MyActivity class i putExtra
  • 以编程方式将 Razor 页面呈现为 HTML 字符串

    Goal 我正在尝试按照我的意愿在后端生成 HTML 字符串 使用 HtmlToPDF 库将其转换为 PDF 我还希望能够在浏览器中轻松查看生成的 HTML 以进行调试 调整 该页面仅在以下情况下才会公开IsDevelopment 我希望它
  • Web Api 请求内容在操作过滤器中为空

    我有一个名为Log尝试将请求和响应的内容记录到文本文件中 我已将其放在我的控制器上以涵盖所有操作 在LogAttribute我正在以字符串形式读取内容 ReadAsStringAsync 所以我不会丢失请求正文 public class L
  • 如何删除带或不带空格的空行

    我有一个大字符串 我用换行符分割它 如何删除所有空行 仅限空白 伪代码 for stuff in largestring remove stuff that is blank 尝试列表理解和string strip http docs py
  • C++17 赋值排序:GCC 中仍未实现?

    我尝试了以下代码作为实现交换的天真的尝试R and B中的字节数ABGR word include
  • 为什么所需的 Startup 类不需要实现适当的接口,例如 IStartup?

    使用武士刀 为什么Startup类不应实现各自的接口 例如 interface IStartup void Configuration IAppBuilder app public class MyStartup IStartup publ
  • 在线求职门户系统用例图

    我想要一个在线求职门户系统的正确用例图 这是我的尝试 我有些疑惑 我看不出在哪里制作 登录 用例 这是该系统的一个重要用例 该用例图没有显示简单访问者和注册访问者之间的区别 前者可以查看职位空缺 查看建议 而无需拥有帐户 后者可以查看职位空
  • 使用 PyYAML.dump() 生成锚点?

    我希望能够在 PyYAML 的 dump 函数生成的 YAML 中生成锚点 有没有办法做到这一点 理想情况下 锚点应与 YAML 节点具有相同的名称 Example import yaml yaml dump a 1 2 3 a 1 2 3
  • 使用 php curl 抓取动态加载网站

    我是抓取新手 已经正式废弃了两个网站 但是当我尝试抓取动态加载网站时 问题出现了 当网站用 JavaScript 渲染时 我无法抓取网站的内容 有什么方法可以使用该网站的内容php curl或任何其他相关客户PHP 这就是我到目前为止所做的
  • 等到所有 jQuery Ajax 请求完成?

    如何让一个函数等待 直到所有 jQuery Ajax 请求在另一个函数内完成 简而言之 我需要等待所有 Ajax 请求完成后才能执行下一个请求 但如何呢 jQuery 现在定义了一个当函数 http api jquery com jQuer
  • F# 将元素添加到序列

    一个简单的问题我找不到答案 如何将元素添加到序列中 例如 我有一个 seq 和一个 newElem XElement 我想附加到它 Thanks 序列追加 gt let x 1 5 val x seq
  • 与普通对象类似地访问 JavaScript 映射

    我正在使用地图 因为我想存储一个对象作为键 我的问题是 我可以像访问普通对象一样访问地图吗 例如 let m new Map let obj foo bar m obj baz console log m obj 这应该按原样正常工作吗 还
  • 返回 R 中函数的函数

    我正在尝试创建一个创建并返回新函数的函数 我已经尝试过以下方法 但它不起作用 我想 myfunc lt function W myfunc2 function X Y W X return Y return myfunc2 我希望能够在 m
  • 示例设置.xml

    如何配置settings xml在马文 另外 请分享一个示例settings xml 这是带有注释的股票 settings xml 完整 未切割的文件位于底部 License
  • php:从字符串中删除 URL

    我有很多字符串 twitter 推文 当我回显它们时 我想从中删除链接 我无法控制该字符串 即使所有链接都以 http 开头 它们也可以以 或 结尾 不 并且后面是否有空格 此外 有时链接与其前面的单词之间没有空格 此类字符串的一个示例 T
  • 将 C++ 实例方法与 C 回调函数混合

    problem 我有一个来自 C 库的以下 C 回调签名Foo void RequestCallbackFunc int 该库还提供了用于注册所述回调的实用函数 extern void SetRequestCallback Requesta