SORU
20 NİSAN 2009, PAZARTESİ


Örnek Boost kullanarak::tam bir C Eventing Sinyaller

Boost.org bu adresleme de öğretici farkındayım: Boost.org Signals Tutorial ama bu örnekler tam ve üzerinde biraz basitleştirilmiş. Örnekleri dosyaları vardır gösterme ve kod bazı bölümleri biraz belirsiz.

İhtiyacım olan şey burada:
ClassA sinyalleri/birden çok olay yükseltir
ClassB bu olaylara abone olur (Birden fazla sınıflar abone olabilir)

Projemde bu mesajları bazı işlem yapan bir iş sınıfı için olayları yükseltir işleyicisi alt düzey bir mesajım var ve UI (wxFrames) bildirir. Bu sipariş ne, kim kimi arar, vb) kablolu olabilir nasıl bilmek istiyorum.

CEVAP
21 NİSAN 2009, Salı


Aşağıdaki kod istediğiniz ne az çalışan bir örnektir. ClassA iki sinyal; SigA (ve kabul) herhangi bir parametre, SigB Gönderen int bir gönderir yayar. ClassB her bir fonksiyon çağrıldığında cout çıkış olan iki işlevi vardır. Örnekte ClassA (a) ve ClassB iki (b b2) bir örneği yok. main ve sinyalleri bağlamak için ateş kullanılır. ClassA ClassB birbirimize bir şey olduğunu belirterek değer (değiller yaniderleme zamanı bağlı).

#include <boost/signal.hpp>
#include <boost/bind.hpp>
#include <iostream>

using namespace boost;
using namespace std;

struct ClassA
{
    signal<void ()>    SigA;
    signal<void (int)> SigB;
};

struct ClassB
{
    void PrintFoo()      { cout << "Foo" << endl; }
    void PrintInt(int i) { cout << "Bar: " << i << endl; }
};

int main()
{
    ClassA a;
    ClassB b, b2;

    a.SigA.connect(bind(&ClassB::PrintFoo, &b));
    a.SigB.connect(bind(&ClassB::PrintInt, &b,  _1));
    a.SigB.connect(bind(&ClassB::PrintInt, &b2, _1));

    a.SigA();
    a.SigB(4);
}

Çıkış:

Foo
Bar: 4
Bar: 4

Kısalık için alıyorum ben bazı kısayolları olmaz normal kullanımda üretim kodu (özellikle access kontrol lax, normalde 'gizle' sinyali kayıt arkasında bir fonksiyon gibi KeithB örneği).

boost::signal zorluk en boost::bind kullanmaya alışık almak gibi görünüyor.biraz zihin-bükme başta! Zor bir örneğin de SigA olsa da bind ClassB::PrintInt *ile 21* kanca için kullanabilirsinizdeğilint: bir yayarlar

a.SigA.connect(bind(&ClassB::PrintInt, &b, 10));

Bu yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ecf150king

    ecf150king

    20 Ocak 2006
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • SPBedition

    SPBedition

    24 HAZİRAN 2013