增强信号:在类接口中公开信号本身或连接/断开方法?

时间:2013-09-20 16:44:13

标签: c++ boost signals-slots boost-signals2

当在一个类中有信号时,在“接口”类中公开信号本身是否被认为是一种好习惯?

class MyClass
{
public:
    boost::signals2::signal<void()>& SomethingHappened()
    {
        return m_Signal;
    }

private:
    boost::signals2::signal<void()> m_Signal;
};

我见过人们写“注册”(可能还有“取消注册”)的功能:

class MyClass2
{
public:
    boost::signals2::connection RegisterHandler(std::function<void()>& handler)
    {
        return m_Signal.connect(handler);
    }

private:
    boost::signals2::signal<void()> m_Signal;
};

我更喜欢第一种方法,因为我不想将我班级的用户限制为我提供的功能。但是,是否有理由更喜欢第二种方法?

1 个答案:

答案 0 :(得分:1)

第二种变体不太好:您不允许呼叫者使用信号的跟踪机制。

但如果您将function替换为your_signal::slot_type(或事件更好,your_signal::extended_slot_type),它将提供比第一个变体更好的封装。特别是,它会阻止呼叫者滥用(或滥用)m_Signal,如下所示:

SomethingHappened().disconnect_all();