Po poleceniu @ anno, aby spojrzeć na boot :: signal, robi się po badaniu, wydaje się możliwą opcją, chociaż jest, zgodnie z oczekiwaniami, nie tak proste jak obiektywne rozwiązania C. Patrząc przez boost::signal tutorial, myślałem, że przejdę przez najbardziej istotne aspekty problemu.
Aby utworzyć nadawców powiadomień:
Rozważmy prostą usługę dostarczania wiadomości, gdzie klienci łączą się z dostawcą wiadomości, które następnie wysyła wiadomości do wszystkich podłączonych klientów, jak przybywa informacji. Usługa dostarczania wiadomości może być skonstruowana tak:
class NewsItem { /* ... */ };
boost::signal<void (const NewsItem&)> deliverNews;
Celem deliverNews
jest informowanie obserwatorów że NewsItem
został wygenerowany.
Obserwatorzy mogą być dodawane w następujący sposób (przy użyciu biblioteki boost :: wiązania):
klientów, którzy chcieliby otrzymywać aktualizacje wiadomości wystarczy podłączyć obiekt funkcji, który może odbierać przedmioty nowinę deliverNews sygnał. Na przykład, możemy mieć specjalny obszar wiadomości w naszej aplikacji specjalnie dla nowości, np ,:
struct NewsMessageArea : public MessageArea
{
public:
// ...
void displayNews(const NewsItem& news) const
{
messageText = news.text();
update();
}
};
// ...
NewsMessageArea newsMessageArea = new NewsMessageArea(/* ... */);
// ...
deliverNews.connect(boost::bind(&NewsMessageArea::displayNews, newsMessageArea, _1));
Aby rozwiązać problem usuwania obserwatorów które były zwalniane z listy, boost :: sygnał oferuje następujące rozwiązanie
jednak co zrobić, jeśli użytkownik zamyka obszar wiadomości wiadomości, niszcząc przedmiot newsMessageArea że deliverNews wie o? Najprawdopodobniej wystąpi błąd segmentacji . Jednak z Boost.Signals trzeba tylko tylko sprawić, by NewsMessageArea mógł być śledzony, a automat do gry z udziałem newsMessageArea zostanie rozłączony, gdy newsMessageArea zostanie zniszczony na .Klasa NewsMessageArea składa trackable wyprowadzając publicznie z boost :: :: klasie trackable sygnałów, np:
struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
// ...
};
W tej chwili nie jest istotnym ograniczeniem w wykorzystaniu śledzenia obiektów w tworzenie połączeń slotowych: obiekty funkcyjne zbudowane przy użyciu Boost.Bind są rozumiane tak, że wskaźniki i odwołania do obiektów doładowania :: bind zostaną znalezione i śledzone.
Czy próbowałeś Boost.signals? – anno
Popatrzę, dzięki za sugestię. – jbat100
Przy nieco odmiennym podejściu, Qt zaimplementował "sygnały i gniazda" za pośrednictwem dedykowanego narzędzia do przetwarzania wstępnego (moc <-> kompilator meta obiekt). Jednak rozsądne jest używanie go tylko wtedy, gdy spełniasz twoje potrzeby. –