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

クラスのユーザーを私が提供する機能に制限したくないので、最初のアプローチを好みます。しかし、2番目のアプローチを好む正当な理由はありますか?

4

1 に答える 1

2

2 番目のバリアントはあまり良くありません。発信者がシグナルの追跡メカニズムを使用することを許可しません。

しかし、 (またはより良いイベント)で置き換えるfunctionと、最初のバリアントよりも優れたカプセル化が提供されます。特に、次のように、発信者が を誤用 (または悪用) するのを防ぎます。your_signal::slot_typeyour_signal::extended_slot_typem_Signal

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