c++ - 信号/槽与直接函数调用

标签 c++ qt

<分区>

所以我开始学习 Qt 4.5,发现 Signal/Slot 机制很有帮助。然而,现在我发现自己正在考虑两种类型的架构。

这是我要用的

class IDataBlock
{
   public:
   virtual void updateBlock(std::string& someData) = 0;
}

class Updater
{

   private:
    void updateData(IDataBlock &someblock)
    {
         ....
       someblock.updateBlock(data);
          ....
    }
}

注意:内联代码是为了简洁。

现在有了信号我就可以了

void Updater::updateData()
{
    ...
    emit updatedData(data);
}

这更简洁,减少了对接口(interface)的需求,但我应该这样做吗?第一个代码块需要更多的输入和更多的类,但它显示了一种关系。使用第二个代码块,一切都更加“无形”。哪一个更可取,如果是个案,指导原则是什么?

最佳答案

发出信号需要很少的开关和一些额外的函数调用(取决于连接的内容和连接方式),但开销应该是最小的。

信号提供者无法控制它的客户是谁,即使他们在发出返回时实际上都收到了信号也是如此。

这非常方便并且允许完全解耦,但是当执行顺序很重要或者当你想返回一些东西时也会导致问题。

永远不要传递指向临时数据的指针(除非你确切地知道你在做什么,即使那样......)。如果必须的话,传递成员变量的地址——Qt 提供了一种方法来延迟对象的销毁,直到它的所有事件都被处理完。

信号也可能需要运行事件循环(除非我认为是直接连接)。

总的来说,它们在事件驱动的应用程序中很有意义(实际上,没有它们很快就会变得非常烦人)。

如果您已经在项目中使用 Qt,一定要使用它们。如果不能接受对 Qt 的依赖,boost 也有类似的机制。

关于c++ - 信号/槽与直接函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1163236/

相关文章:

c++ - 用于散点图的排序浮点 vector (C++/QCustomPlot)

c++ - 为什么真陈述是假的?

c++ - 使用 OpenCV 库编译 SSE 代码

c++ - Qt 中的子目录模板

c++ - 将字符串转换为 char* 问题

c++ - 将 NULL 视为 QByteArray 中的字符

c++ - QTableWidgetItem 子类运算符 <() 在对 QTableWidget 进行排序时永远不会被调用

c++ - Node 插件编译错误

c++ - 从模板类中调用模板函数

c++ - 为什么函数accept()和recv()中地址长度参数是指针?