Seguendo la raccomandazione di @ anno di guardare il segnale boot ::, dopo l'esame sembra una possibile opzione anche se, come previsto, non è così semplice come le soluzioni oggettive in C. Guardando attraverso il boost::signal tutorial, ho pensato che avrei affrontato gli aspetti più rilevanti per il problema in questione.
Per creare mittenti di notifica:
consideri un servizio di news di consegna semplice, in cui i client si connettono a un provider di notizie che poi invia notizia a tutti i client connessi come arriva informazioni. Il servizio di notizie di consegna può essere costruito in questo modo:
class NewsItem { /* ... */ };
boost::signal<void (const NewsItem&)> deliverNews;
L'obiettivo di deliverNews
è quello di informare gli osservatori che un NewsItem
è stato generato.
osservatori possono essere aggiunti come segue (utilizzando la libreria boost :: bind):
I clienti che desiderano ricevere aggiornamenti sufficiente collegare un oggetto funzione che può ricevere le notizie ai deliverNews segnale. Per esempio, possiamo avere una speciale area di messaggio nella nostra applicazione appositamente per le notizie, ad esempio ,:
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));
Per affrontare il problema della rimozione osservatori che sono stati disallocati dalla lista, boost :: segnale offre la seguente soluzione
Tuttavia, cosa succede se l'utente chiude l'area dei messaggi notizie, distruggendo l'oggetto newsMessageArea che deliverNews conosce? Molto probabilmente, si verificherà un errore di segmentazione . Tuttavia, con Boost.Signals è necessario rendere NewsMessageArea solo tracciabile e lo slot che coinvolge newsMessageArea verrà disconnesso quando newsMessageArea è distrutto.La classe NewsMessageArea è fatto rintracciabile derivando pubblicamente dalla boost :: segnali :: classe rintracciabile, ad esempio:
struct NewsMessageArea : public MessageArea, public boost::signals::trackable
{
// ...
};
A questo punto v'è una limitazione significativa per l'utilizzo del rintracciabili oggetti creazione di connessioni slot: oggetti funzione creati utilizzando Boost.Bind sono compresi, in modo tale che puntatori o riferimenti a oggetti tracciabili passati a boost :: bind vengano trovati e tracciati.
Hai provato Boost.signals? – anno
Darei un'occhiata, grazie per il suggerimento. – jbat100
Con un approccio leggermente diverso, Qt ha implementato "segnali e slot" tramite uno strumento di pre-elaborazione dedicato (compilatore di meta oggetti moc <->). Tuttavia, è solo ragionevole usarlo se qt ui si adatta alle tue esigenze. –