【发布时间】:2014-07-29 13:02:28
【问题描述】:
我正在与另一个团队合作开展一个项目。另一个团队正在构建一个 GUI,与大多数 GUI 框架一样,它是非常受继承驱动的。另一方面,这一边的代码('底端',我猜有人可以说)本质上是 C (尽管我相信通过 MSVC2010 工具链在技术上都是 C++,没有“视为 C”标志。
两个模块(UI 和 this)必须单独编译,然后链接在一起。
问题: 需要在底端调用 GUI 端的重绘函数,并为其提供一些数据。现在事情变得糟糕了。您如何调用 INTO 一组成员函数,尤其是具有复杂依赖关系的成员函数?如果我尝试包含窗口标题,则有一英里长的 GUI 内容有一个继承列表,底端显然不是针对复杂的 GUI 库构建的……我无法转发声明我的出路,因为我需要在窗口上调用函数?
现在显然这是一个重大的沟通设计缺陷,尽管我们现在处于不利的境地,重大重组并不是真正的选择。
问题:
应该如何组织它以使底部与顶部接触以进行重绘,从类似 C 的代码球到 C++ 节点球。
我现在可以做些什么来规避这个问题?
我能想到的唯一好方法是使用某种通信类......但我不认为这不会遇到同样的问题,因为它需要同时针对 GUI 和底线?
【问题讨论】:
-
底层设置脏标志或者调用回调什么的怎么样,然后让高层代码做需要访问高层的东西
-
在windoze上,触发重绘的常用方法是发布消息。 “低”代码可以发布一条消息,UI 在消息队列中拾取该消息。除此之外,很难从您对问题的描述中看出。
-
正如 Alf 所说,回调听起来不错 - 例如您可以让 GUI 代码设置一个函数指针(如果您喜欢冒险,甚至可以设置
std::function),当“C”代码到达它知道可能需要重绘的点时,它通过函数指针调用(如果不是nullptr)。 GUI 端总是可以提供一个函数指针,指向一些存储上下文的中间函数(你的“给它一些数据”)然后调用成员函数。 -
至于使用函数指针——我不会遇到同样的问题吗?非成员函数指针与成员函数指针不同。在声明成员函数指针类型时,必须指定类。 “较低级别”仍然需要了解 GUI 堆栈类,不是吗?不确定成员函数 ptr 的类是否可以是外部的……如果不是,那将是同样的问题。 @user3344003:它使用的是 QT,而不是 Win32 GUI 堆栈。要发布任何消息,它需要了解 GUI 框架 - 即使在 Win32 中也是如此。