2008-09-16 39 views
8

Có thể tạo các sự kiện tùy chỉnh trong C++ không? Ví dụ, nói rằng tôi có biến X, và biến Y. Bất cứ khi nào X thay đổi, tôi muốn thực hiện một hàm đặt Y bằng 3X. Có cách nào để tạo ra một kích hoạt/sự kiện như vậy? (kích hoạt phổ biến trong một số cơ sở dữ liệu)Sự kiện tùy chỉnh trong C++?

Trả lời

0

Theo như tôi biết bạn không thể làm điều đó với biến mặc định, tuy nhiên nếu bạn đã viết một lớp học mà mất một chức năng gọi lại bạn có thể cho phép các lớp khác đăng ký rằng họ muốn được thông báo về bất kỳ thay đổi nào.

10

Điều này về cơ bản là một ví dụ của mẫu Observer (như những người khác đã đề cập và liên kết). Tuy nhiên, bạn có thể sử dụng mẫu ma thuật để làm cho nó dễ hơn một chút về cú pháp. Hãy xem xét một cái gì đó giống như ...

template <typename T> 
class Observable 
{ 
    T underlying; 

public: 
    Observable<T>& operator=(const T &rhs) { 
    underlying = rhs; 
    fireObservers(); 

    return *this; 
    } 
    operator T() { return underlying; } 

    void addObserver(ObsType obs) { ... } 
    void fireObservers() { /* Pass every event handler a const & to this instance /* } 
}; 

Sau đó, bạn có thể viết ...

Observable<int> x; 
x.registerObserver(...); 

x = 5; 
int y = x; 

phương pháp gì bạn sử dụng để viết các chức năng gọi lại quan sát của bạn là hoàn toàn tùy thuộc vào bạn; Tôi đề nghị chức năng hoặc mô-đun chức năng của http://www.boost.org (bạn cũng có thể sử dụng các trình đơn giản). Tôi cũng cảnh cáo bạn phải cẩn thận về loại điều hành quá tải này. Mặc dù nó có thể làm cho một số kiểu mã hóa rõ ràng hơn, thiếu thận trọng khi sử dụng một cái gì đó như là

seemLikeAnIntToMe = 10;

a rất hoạt động đắt tiền, có thể phát nổ và gây ra những cơn ác mộng trong nhiều năm tới.

+0

Giải thích tuyệt vời! Tôi đã sử dụng tăng cường trong các dự án trước đây và luôn luôn hài lòng với kết quả. –

3

Boost signals là một thư viện thường được sử dụng khác mà bạn có thể gặp phải để thực hiện Mẫu quan sát (aka Publish-Subscribe). Người mua hãy cẩn thận ở đây, tôi đã nghe hiệu suất của nó là khủng khiếp.

Các vấn đề liên quan