4

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

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;
};

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

4

1 回答 1

2

第二个变体不太好:你不允许调用者使用信号的跟踪机制。

但是,如果您functionyour_signal::slot_type(或更好的事件,your_signal::extended_slot_type)替换,它将提供比第一个变体更好的封装。特别是,它可以防止调用者误用(或滥用)m_Signal,如下所示:

SomethingHappened().disconnect_all();
于 2013-09-24T13:23:31.950 回答