5

Po programowaniu przez jakiś czas w ramach C obiektów C iOS i Mac, pokochałem ogólny wzorzec powiadomień wdrożony przez NSNotificationCenter i klasy NSNotification. Wracając do C++, który zawsze był moim ulubionym językiem dla większości rzeczy, próbuję powtórzyć ten wzorzec i sądzę, że powinna już istnieć ogólna implementacja podobnych klas C++ oferujących wsparcie dla tego.Centrum powiadomień w języku C++

Wygląda na to, że wzorzec jest nieco trudniejszy do wdrożenia w C++ niż Cel C ze względu na bardziej dynamiczny charakter późniejszego, ale wydaje się to dalekie od niemożliwego. Przejrzałem biblioteki doładowania, ponieważ generalnie są niesamowite i smutno było nie znaleźć tam szczęścia. Chociaż funkcja boost :: bind, boost :: lamda, boost :: sprawiają wrażenie, że wykonują większość pracy. Czy przegapiłem coś oczywistego? Czy istnieje już coś, co pozwoli mi na łatwe replikowanie zachowania NSNotification/NSNotificationCenter?

+0

Czy próbowałeś Boost.signals? – anno

+0

Popatrzę, dzięki za sugestię. – jbat100

+0

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. –

Odpowiedz

1

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.

2

Teoretycznie można utworzyć klasę, która ma wektor wskaźników funkcyjnych do wywoływania, gdy wywoływane jest określone powiadomienie. - Klasa, która ma słownik, w którym obiekty są wektorami funkcji do wywoływania po naciśnięciu powiadomienia.

2

Oprócz wymienionych w innych odpowiedziach pakietów boost, inną opcją jest poco::NotificationCenter.

Ta implementacja jest bliżej ramach zgłoszenia kakao, jak szczegółowo omówione na Poco na documentation:

Klasa NotificationCenter jest w zasadzie C++ implementacja klasy NSNotificationCenter znaleźć w Apple kakao (lub OpenStep).