2016-04-07 27 views
4

C++' da bir sınıfın üyesi olarak çağrıldığında, libusb_fill_bulk_transfer numaralı geri çağırma işlevini tanımlama ve kullanma konusunda bir sorunum var.libusb callback_in işlevi C++ 'da bir sınıfın üyesi olarak işlev

... 
... 
libusb_fill_bulk_transfer(transfer_in, usb_dev, USB_ENDPOINT_IN, 
      in_buffer, LEN_IN_BUFFER, callback_in, NULL, 0); 
... 
... 

: Ben buna nasıl burada

void LIBUSB_CALL usb_connector::USBConnector::callback_in(struct libusb_transfer *transfer) 
{ 
    if (transfer == NULL) { 
     cout << "No libusb_transfer..." << endl; 
    } 
    else { 
     cout << "libusb_transfer structure: " << endl; 
     cout << "actual_length = " << transfer->actual_length << endl; 
     for (int i = 0; i < transfer->actual_length; i++) { 
      cout << transfer->buffer[i]; 
     } 
     cout << endl; 
    } 

    return; 
} 

Ve edilir: Burada

namespace usb_connector 
{ 
    class USBConnector 
    { 
    public: 
     USBConnector(); 
     ~USBConnector(); 
     int connect(void); 
     void read(void); 
     void write(unsigned char *); 
     void disconnect(void); 
     void LIBUSB_CALL callback_in(struct libusb_transfer*); 
... 

sınıfında uygulamasıdır: Burada

sınıfta tanımıdır Aldığım hata şu şekildedir:

error: cannot convert 'usb_connector::USBConnector::callback_in' from type 'void (usb_connector::USBConnector::)(libusb_transfer*)' to type 'libusb_transfer_cb_fn {aka void ()(libusb_transfer)}' in_buffer, LEN_IN_BUFFER, callback_in, NULL, 0);

Geri arama işlevini bir sınıfın üyesi olarak nasıl alabilirim ve nasıl arayabilirim?

cevap

4

Sınıf üyesi işlevine bir işaretçi ve bir işlevin işaretçisi C++ ile uyumsuz.

belgelerine göre, geri arama için prototipidir:

void LIBUSB_CALL callback_wrapper(struct libusb_transfer *transfer) 
{ 
    usb_connector::USBConnector *connector = reinterpret_cast<usb_connector::USBConnector*>(transfer->user_data); 
    connector->callback_in(transfer); 
} 

:

typedef void(* libusb_transfer_cb_fn) (struct libusb_transfer *transfer) 

Ve struct libusb_transfer besbelli bir sarmalayıcı gerekir; böylece, geri arama ayarlamak sırasında doldurmak user_data alanına sahiptir Ve çağrı sırasında this iletin:

... 
... 
libusb_fill_bulk_transfer(transfer_in, usb_dev, USB_ENDPOINT_IN, 
      in_buffer, LEN_IN_BUFFER, callback_wrapper, this, 0); 
+0

Kesin bir şekilde, 'callback_wrapper() ', extern" C "olmalıdır. –

+0

@MichaelBurr, sanmıyorum, "extern" C "sadece c manfling'i devre dışı bırakabilir ve eğer bu işlevi C++ işlevinizi isme göre adlandırılan düz c nesnesine karşı bağlarsanız mantıklı olursunuz. Ama biz sadece işaretçi tarafından işlev çağırmak ve burada mangling ile hiçbir şey var. – user2807083

İlgili konular