буст-сигналы: выставить сам сигнал или подключить / отключить методы в интерфейсе класса?

При наличии сигналов в классе считается ли хорошей практикой выставлять сам сигнал в классе «интерфейс»?

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

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

Я видел людей, которые пишут функции «register» (и, возможно, «unregister»):

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

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

Я бы предпочел первый подход, потому что я не хочу ограничивать пользователей моего класса функциями, которые я предлагаю. Однако есть ли веская причина предпочесть второй подход?

2

Решение

Второй вариант не очень хорош: вы не позволяете звонящему использовать механизм отслеживания сигнала.

Но если вы замените function с your_signal::slot_type (или событие лучше, your_signal::extended_slot_type), это обеспечит лучшую инкапсуляцию, чем 1-й вариант. В частности, это предотвратит злоупотребление вызывающими абонентами (или злоупотребление) m_Signal, как это:

SomethingHappened().disconnect_all();
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector