当在一个类中有信号时,在“接口”类中公开信号本身是否被认为是一种好习惯?
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;
};
我更喜欢第一种方法,因为我不想将我班级的用户限制为我提供的功能。但是,是否有理由更喜欢第二种方法?
答案 0 :(得分:1)
第二种变体不太好:您不允许呼叫者使用信号的跟踪机制。
但如果您将function
替换为your_signal::slot_type
(或事件更好,your_signal::extended_slot_type
),它将提供比第一个变体更好的封装。特别是,它会阻止呼叫者滥用(或滥用)m_Signal
,如下所示:
SomethingHappened().disconnect_all();