信号/插槽与直接功能调用

Ext*_*kun 7 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);
          ....
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:代码内联为简洁起见.

现在我可以发出信号

void Updater::updateData()
{
    ...
    emit updatedData(data);
}
Run Code Online (Sandbox Code Playgroud)

这是更清洁,减少了界面的需要,但我应该这样做只是因为我可以吗?第一个代码块需要更多的输入和更多的类,但它显示了一种关系.使用第二块代码,一切都更"无形".哪一个更可取,如果是个案基础,那么指导方针是什么?

Eug*_*ene 10

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

信号的提供者无法控制其客户端是谁,即使他们都在发出返回时实际获得了信号.

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

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

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

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

如果您已在项目中使用Qt,请务必使用它们.如果对Qt的依赖是不可接受的,那么boost也有类似的机制.